/*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. C#调用java类、jar包方法

    一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中tes ...

  2. CSS选择器的特殊性和LOVE HA

    在CSS中当几个相同的选择器对同一个元素有不同的规则时,该怎么应用这些规则呢? 答案就是:CSS特殊性(CSS specificity) 选择器特殊性有选择器本身组成,特殊性由4个数值表述:0, 0, ...

  3. DAY2 Python 标准库 -> Getpass 模块 -> 命令行下输入密码的方法.

    getpass 模块 getpass 模块提供了平台无关的在命令行下输入密码的方法. getpass(prompt) 会显示提示字符串, 关闭键盘的屏幕反馈, 然后读取密码. 如果提示参数省略, 那么 ...

  4. 几个Jquery对话框插件

    项目现状 While Thickbox had its day, it is not maintained any longer, so we recommend you use some alter ...

  5. Effective Java 读书笔记之七 通用程序设计

    一.将局部变量的作用域最小化 1.在第一次使用变量的地方声明 2.几乎每个变量的声明都应该包含一个初始化表达式:try-catch语句是一个例外 3.使方法小而集中是一个好的策略 二.for-each ...

  6. win7平台下React-Native Android:Unable to upload some APKs

    一.问题描述 根据网络上的Win7平台下React-native配置教程配置好开发环境的过程中,在艰难进行到react-native run-android这一步时,发现一直出现错误,截图如下: 错误 ...

  7. 解决mvc部署在IIS上以后出现404错误

    首先:aspnet_regiis -i 如果还不行,更改web.config文件,添加红色的部分 <system.webServer> <modules runAllManagedM ...

  8. 常用的Git Tips

    导读 Git被越来越多的公司使用,因此我们需要了解Git使用过程中的一些技巧. 一.Configuration:配置 列举所有的别名与配置 git config --list Git 别名配置 git ...

  9. Android版2048

    虽然说2048是好久前比较火的小游戏,但直到最近才有机会去研究下2048实现的源码,这里就简单写一下我(bie)的(ren)思路: 首先2048需要有十六个卡片,这个卡片可以用FrameLayout的 ...

  10. mysql连表更新

    1.需求 有2张表,a表和b表,要把b表的name数据复制到a表中,当2表的id字段一样的时候 UPDATE A a, B b SET a.name = b.my_name WHERE a.id = ...