/*9876543210987654234522345
214748364723453452323452345
2147483647234523452323452345
181760911432744962345234523
2345234523434656346345634563测试数据*/
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<iterator>
#include<set>
#include<vector>
#include<map>
#include<utility>
#include<algorithm>
using namespace std; struct BigInteger {
static const int BASE = ; //静态成员变量---属于BigInteger这个类型的,不属于他的结构体变量
static const int WIDTH = ;
vector<int> s; //储存大整数 BigInteger(long long num = ) { //构造函数(带默认值)
*this = num;
}
BigInteger operator = (long long num) {//面对不超过long long的整数
s.clear(); //清空本对象的vector容器内容--以免有上一次数据影响
//将整数里面的数八位八位的 储存到 vector里面去
do {
s.push_back(num % BASE); //假如整数是9位--得到了后面的八位
num /= BASE; //继续得到前面的位数
} while (num > );
return *this; //返回本对象
}
//long long类型不够的情况
BigInteger operator = (const string& str) { //赋值运算符
s.clear();
int x, len = (str.length() - ) / WIDTH + ; //有几个八位一组(多出来的不足8位舍去)
//从右向左8位8位的储存整数到vector<int>中
for (int i = ; i < len; i++) { //按一共有几组八位储存
int end = str.length() - i*WIDTH; //i个八位一组--字符串长度 - 几个八位 = 前面剩余的位数
//取max(0,前面位数 - 8个长度),如果该剩余位数不为0,就取大的
int start = max(,end-WIDTH);
//成为查找一组数的开始位置,如果取的是end-WIDTH,,那么end-start = WIDTH得到了一个八位,当做查找字符串的长度
//sscanf()是将字符以某种形式取出存放到相应的类型中(这里是int),substr(start--开始搜寻的位置(包括),
//end-start----是代表搜寻的长度),c_str()返回一个指针指向字符串相当于一个'\0'结尾的字符数组->用来终止一次
//8位的取出到x
sscanf(str.substr(start,end-start).c_str(), "%d", &x);
//要注意在最高位前面的几组8位中,如果他们的第八位为0,那么组成整数的时候就不会有八位,输出时要注意
s.push_back(x); //将取出的整数push到vector的底部---大数是从右往左的一点点储存进去
}
return *this;
}
//重载 + 运算符
BigInteger operator + (const BigInteger& b) const
{
BigInteger c;
c.s.clear(); //清空c类型中vector内的元素
for (unsigned int i = , g = ; ; i++)
{
if (g == && i >= s.size() && i >= b.s.size())//如果位数已经到了最高位,i大于本对象对象且大于b对象的大小
break; //跳出循环
int x = g;
if (i < s.size()) x += s[i];
if (i < b.s.size()) x += b.s[i];
c.s.push_back(x % BASE); //八位八位的取出取出后(从右向左)
g = x/BASE; //得到最高位向后的位数(一直到从右向左出现的第一次8位前面停止)
}
return c;
} BigInteger operator += (const BigInteger &b)
{
*this = *this + b;
return *this;
} //比较运算符
bool operator < (const BigInteger &b) const
{
if (s.size() != b.s.size())
return s.size() < b.s.size();
for (int i = s.size() - ; i >= ; i--) //从后往前面比较,因为(低位在vector的前面)注:这样做的前提是两个
{ //都没有前导0,否则不能比较
if (s[i] != b.s[i])
return s[i] < b.s[i];
}
return false; //相等
}
bool operator > (const BigInteger &b) const
{
return b < *this;
}
bool operator <= (const BigInteger &b) const
{
return !(b < *this); //相当于返回 本对象 <= b对象
}
bool operator >= (const BigInteger &b) const
{
return !(*this < b);
}
bool operator != (const BigInteger &b) const
{
return b < *this || *this < b;
}
bool operator == (const BigInteger &b) const
{
return !(b < *this) || !(*this < b);
}
}; ostream& operator << (ostream &out, const BigInteger &x)
{
out << x.s.back(); //从右向左输出(因为最高位是最后储存进去的)
//八位八位的写
for (int i = x.s.size()-; i >= ; i--) { //从倒数第二位开始输出
char buf[];
sprintf(buf, "%08d", x.s[i]); //将整数当成字符写到buf中输出,不足八位的补零(因为在前面的几组八位中
//如果不足八位说明在形成整数的过程中最高位为0)
for (unsigned int j = ; j < strlen(buf); j++) //输出八位
out << buf[j];
}
return out;
} istream& operator >> (istream &in, BigInteger &x) {
string s;
if (! (in >> s))
return in;
x = s; //输入正确的流
return in;
} struct cmp {
bool operator () (const BigInteger &a, const BigInteger &b) const { //升序比较
return a < b;
}
}; struct cmpL{
bool operator () (const BigInteger &a, const BigInteger &b) const { //降序比较
return a > b;
}
};
int main(void)
{
BigInteger bi, sum1, mus, b2; set<BigInteger,cmp> s1; vector<BigInteger> s2; map<BigInteger,char,cmpL> s3; pair<BigInteger,char> s4; string ss;
int i = ; /*while (cin >> b2) //利用了重载 >> 提取运算符
{
mus += b2;
}
cout << mus << endl;*/ while (cin >> ss)
{
bi = ss;
sum1 += bi;
s1.insert(bi);
s2.push_back(bi);
s4.first = bi;
s4.second = 'a'+i; //用来检验map里面元素也是可以自动排序的
i++;
s3.insert(s4); } for (set<BigInteger,cmp>::iterator it = s1.begin(); it != s1.end(); ++it) //set升序
cout << *it << endl;
// cout << sum1 << endl;
cout << endl; sort(s2.begin(),s2.end(),cmpL()); //sort 降序
for (vector<BigInteger>::iterator it = s2.begin(); it != s2.end(); ++it)
cout << *it << endl; for (map<BigInteger,char,cmpL>::iterator it = s3.begin(); it != s3.end(); ++it) //map降序
cout << (*it).second << endl;
return ;
}

BigInteger类型的解析_超详细解析的更多相关文章

  1. 8.JVM内存分配机制超详细解析

    一.对象的加载过程 之前研究过类的加载过程.具体详情可查看文章:https://www.cnblogs.com/ITPower/p/15356099.html 那么,当一个对象被new的时候,是如何加 ...

  2. Android属性动画源代码解析(超详细)

    本文假定你已经对属性动画有了一定的了解,至少使用过属性动画.下面我们就从属性动画最简单的使用开始. ObjectAnimator .ofInt(target,propName,values[]) .s ...

  3. jdk动态代理和cglib动态代理底层实现原理超详细解析(jdk动态代理篇)

    代理模式是一种很常见的模式,本文主要分析jdk动态代理的过程 1.举例 public class ProxyFactory implements InvocationHandler { private ...

  4. Vue(13)子组件与父组件超详细解析

    父组件和子组件 我们经常分不清什么是父组件,什么是子组件.现在来简单总结下:我们将某段代码封装成一个组件,而这个组件又在另一个组件中引入,而引入该封装的组件的文件叫做父组件,被引入的组件叫做子组件.具 ...

  5. 干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇

    01 首先来区分几个概念 关于neighborhood serach,这里有好多种衍生和变种出来的胡里花俏的算法.大家在上网搜索的过程中可能看到什么Large Neighborhood Serach, ...

  6. (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)

    当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异常重要了. 原文:http://www.jianshu.com/p/163c96983 ...

  7. 【内核】探究linux内核,超详细解析子系统

    Perface 前面已经写过一篇<嵌入式linux内核的五个子系统>,概括性比较强,也比较简略,现在对其进行补充说明. 仅留此笔记,待日后查看及补充! Linux内核的子系统 内核是操作系 ...

  8. 【Java面试题】2 Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?超详细解析

    /* * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 * 答: * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的 ...

  9. js判断undefined类型,undefined,null, 的区别详细解析

    js判断undefined类型 今天使用showModalDialog打开页面,返回值时.当打开的页面点击关闭按钮或直接点浏览器上的关闭则返回值是undefined所以自作聪明判断 var reVal ...

随机推荐

  1. 21个免费的UI设计工具和资源网站,不管是web,js,android都

    本帖最后由 hua631150873 于 2014-9-12 18:26 编辑 Lumzy 官方地址:http://www.lumzy.com/ Lumzy是一个网站应用和原型界面制作工具.使用Lum ...

  2. python __name__

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个 ...

  3. [转载]localhost与127.0.0.1的区别

    原文链接:http://blog.csdn.net/xifeijian/article/details/12879395 很多人会接触到这个ip地址127.0.0.1.也许你会问127.0.0.1是什 ...

  4. Java中如何解决double和float精度不准的问题

    我们知道浮点数是无法在计算机中准确表示的,例如0.1在计算机中只是表示成了一个近似值,因此,对付点数的运算时结果具有不可预知性. 在进行数字运算时,如果有double或float类型的浮点数参与计算, ...

  5. QT 信号与槽connect

    QT 信号与槽connect QT 信号与槽connect connect函数调用几个限制 connect函数代码 QT中信号与槽的连接使用的connect函数是一个静态函数,在类QObject中定义 ...

  6. SVN的目录说明

    subversion目录说明:*dav目录:是提供apache与mod_dav_svn使用的目录,让他们存储内部数据*db目录:就是所有版本控制的数据存放文件*hooks目录:放置hook脚本文件的目 ...

  7. 3.5---用栈实现队列(CC150)

    手写时候,别忘记import java.util.Stack; import java.util.Stack; class MyQueue { Stack<Integer> s1 = ne ...

  8. [黑科技]bit reverse

    写FFT的时候yy出来了这个bit reverse...时间复杂度O(n),常数大概是(a[x>>1]>>1)|((x&1)<<26)的二分之一(-O3下) ...

  9. Python类的特点 (2) :类属性与实例属性的关系

    测试代码: #encoding:utf-8 class Parent(object): x=1 #x是Parent类的属性(字段) ls=[1,2] #ls是一个列表,也是Parent类的属性(字段) ...

  10. keepalived和heartbeat区别

    <1>Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP):Heartbeat是基于主机或网 ...