/*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. 关于CSS中对IE条件注释的问题

    一.通用区分方式:IE6.IE7能识别*,标准浏览器(如FF)不能识别*:IE6能识别*,但不能识别 !important:IE7能识别*,也能识别 !important:IE8能识别\0,不能识别* ...

  2. objc/runtime

    "T@\"MyInnerObject\",&,N,V_myInnerObject" MyInnerObject "Td,N,V_cgfloat ...

  3. javascript中数组concat()join()split()

    concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 所以 <script type="text/javascript" ...

  4. OpenCV成长之路(6):数学形态学基本操作及其应用

    数学形态学实际上可以理解为一种滤波行为,所以很多地方称它为形态学滤波.有了个这概念,我们就能更好的理解它.我们滤波中用的滤波器(kernel)在这里被称为结构元素,结构元素往往是由一个特殊的形状构成, ...

  5. 9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  6. Flask 模板语言

    Flask使用的是Jinja2模板引擎 举个例子: from flask import Flask, render_template app = Flask(__name__) @app.route( ...

  7. Android Xpose Hook(一)

    实验环境:     Droid4x模拟器 (目前Android版本4.2.2)     Android Studio 1.下载相关工具 XposedInstaller下载 http://repo.xp ...

  8. [转]servlet的执行原理与生命周期

    一.先从servlet容器说起:大家最为熟悉的servlet容器就是Tomcat ,Servlet 容器是如何管理 Servlet? 先看一下tomcat的容器模型: 从上图可以看出 Tomcat 的 ...

  9. AngularJS之Provider, Value, Constant, Service, Factory, Decorator的区别与详解

    本文转载自http://camnpr.com/javascript/1693.html 首先,provider, value, constant, service, factory他们都是provid ...

  10. POJ 3414

    http://poj.org/problem?id=3414 这是一个广搜的题目,不难,就是有些许麻烦.对于练习还是个不错的题目. 题意就是给你两个杯子,这两个杯子的容量分别为a和b,要你通过一些操作 ...