1 /*98765432109876542345223452 2147483647234534523234523453 21474836472345234523234523454 1817609114327449623452345235 2345234523434656346345634563测试数据*/
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
16 using namespacestd;17
18 structBigInteger {19 static const int BASE = 100000000; //静态成员变量---属于BigInteger这个类型的,不属于他的结构体变量
20 static const int WIDTH = 8;21 vector s; //储存大整数
22
23 BigInteger(long long num = 0) { //构造函数(带默认值)
24 *this =num;25 }26 BigInteger operator = (long long num) {//面对不超过long long的整数
27 s.clear(); //清空本对象的vector容器内容--以免有上一次数据影响28 //将整数里面的数八位八位的 储存到 vector里面去
29 do{30 s.push_back(num % BASE); //假如整数是9位--得到了后面的八位
31 num /= BASE; //继续得到前面的位数
32 } while (num > 0);33 return *this; //返回本对象
34 }35 //long long类型不够的情况
36 BigInteger operator = (const string& str) { //赋值运算符
37 s.clear();38 int x, len = (str.length() - 1) / WIDTH + 1; //有几个八位一组(多出来的不足8位舍去)39 //从右向左8位8位的储存整数到vector中
40 for (int i = 0; i < len; i++) { //按一共有几组八位储存
41 int end = str.length() - i*WIDTH; //i个八位一组--字符串长度 - 几个八位 = 前面剩余的位数42 //取max(0,前面位数 - 8个长度),如果该剩余位数不为0,就取大的
43 int start = max(0,end-WIDTH);44 //成为查找一组数的开始位置,如果取的是end-WIDTH,,那么end-start = WIDTH得到了一个八位,当做查找字符串的长度45 //sscanf()是将字符以某种形式取出存放到相应的类型中(这里是int),substr(start--开始搜寻的位置(包括),46 //end-start----是代表搜寻的长度),c_str()返回一个指针指向字符串相当于一个'\0'结尾的字符数组->用来终止一次47 //8位的取出到x
48 sscanf(str.substr(start,end-start).c_str(), "%d", &x);49 //要注意在最高位前面的几组8位中,如果他们的第八位为0,那么组成整数的时候就不会有八位,输出时要注意
50 s.push_back(x); //将取出的整数push到vector的底部---大数是从右往左的一点点储存进去
51 }52 return *this;53 }54 //重载 + 运算符
55 BigInteger operator + (const BigInteger& b) const
56 {57 BigInteger c;58 c.s.clear(); //清空c类型中vector内的元素
59 for (unsigned int i = 0, g = 0; ; i++)60 {61 if (g == 0 && i >= s.size() && i >= b.s.size())//如果位数已经到了最高位,i大于本对象对象且大于b对象的大小
62 break; //跳出循环
63 int x =g;64 if (i < s.size()) x +=s[i];65 if (i < b.s.size()) x +=b.s[i];66 c.s.push_back(x % BASE); //八位八位的取出取出后(从右向左)
67 g = x/BASE; //得到最高位向后的位数(一直到从右向左出现的第一次8位前面停止)
68 }69 returnc;70 }71
72 BigInteger operator += (const BigInteger &b)73 {74 *this = *this +b;75 return *this;76 }77
78
79 //比较运算符
80 bool operator < (const BigInteger &b) const
81 {82 if (s.size() !=b.s.size())83 return s.size() = 0; i--) //从后往前面比较,因为(低位在vector的前面)注:这样做的前提是两个
85 { //都没有前导0,否则不能比较
86 if (s[i] !=b.s[i])87 return s[i]
90 }91 bool operator > (const BigInteger &b) const
92 {93 return b < *this;94 }95 bool operator <= (const BigInteger &b) const
96 {97 return !(b < *this); //相当于返回 本对象 <= b对象
98 }99 bool operator >= (const BigInteger &b) const
100 {101 return !(*this
104 {105 return b < *this || *this
108 {109 return !(b < *this) || !(*this
113 ostream& operator << (ostream &out, const BigInteger &x)114 {115 out << x.s.back(); //从右向左输出(因为最高位是最后储存进去的)116 //八位八位的写
117 for (int i = x.s.size()-2; i >= 0; i--) { //从倒数第二位开始输出
118 char buf[20];119 sprintf(buf, "%08d", x.s[i]); //将整数当成字符写到buf中输出,不足八位的补零(因为在前面的几组八位中120 //如果不足八位说明在形成整数的过程中最高位为0)
121 for (unsigned int j = 0; j < strlen(buf); j++) //输出八位
122 out <
127 istream& operator >> (istream &in, BigInteger &x) {128 strings;129 if (! (in >>s))130 return in;131 x = s; //输入正确的流
132 return in;133 }134
135 structcmp {136 bool operator () (const BigInteger &a, const BigInteger &b) const { //升序比较
137 return a
141 structcmpL{142 bool operator () (const BigInteger &a, const BigInteger &b) const { //降序比较
143 return a >b;144 }145 };146 int main(void)147 {148 BigInteger bi, sum1, mus, b2;149
150 sets1;151
152 vectors2;153
154 maps3;155
156 pairs4;157
158 stringss;159 int i = 1;160
161 /*while (cin >> b2) //利用了重载 >> 提取运算符162 {163 mus += b2;164 }165 cout << mus << endl;*/
166
167 while (cin >>ss)168 {169 bi =ss;170 sum1 +=bi;171 s1.insert(bi);172 s2.push_back(bi);173 s4.first =bi;174 s4.second = 'a'+i; //用来检验map里面元素也是可以自动排序的175 i++;176 s3.insert(s4);177
178 }179
180 for (set::iterator it = s1.begin(); it != s1.end(); ++it) //set升序
181 cout << *it <
183 cout <
185 sort(s2.begin(),s2.end(),cmpL()); //sort 降序
186 for (vector::iterator it = s2.begin(); it != s2.end(); ++it)187 cout << *it <
189 for (map::iterator it = s3.begin(); it != s3.end(); ++it) //map降序
190 cout << (*it).second <