BigInteger类型的解析_超详细解析
/*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类型的解析_超详细解析的更多相关文章
- 8.JVM内存分配机制超详细解析
一.对象的加载过程 之前研究过类的加载过程.具体详情可查看文章:https://www.cnblogs.com/ITPower/p/15356099.html 那么,当一个对象被new的时候,是如何加 ...
- Android属性动画源代码解析(超详细)
本文假定你已经对属性动画有了一定的了解,至少使用过属性动画.下面我们就从属性动画最简单的使用开始. ObjectAnimator .ofInt(target,propName,values[]) .s ...
- jdk动态代理和cglib动态代理底层实现原理超详细解析(jdk动态代理篇)
代理模式是一种很常见的模式,本文主要分析jdk动态代理的过程 1.举例 public class ProxyFactory implements InvocationHandler { private ...
- Vue(13)子组件与父组件超详细解析
父组件和子组件 我们经常分不清什么是父组件,什么是子组件.现在来简单总结下:我们将某段代码封装成一个组件,而这个组件又在另一个组件中引入,而引入该封装的组件的文件叫做父组件,被引入的组件叫做子组件.具 ...
- 干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇
01 首先来区分几个概念 关于neighborhood serach,这里有好多种衍生和变种出来的胡里花俏的算法.大家在上网搜索的过程中可能看到什么Large Neighborhood Serach, ...
- (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)
当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异常重要了. 原文:http://www.jianshu.com/p/163c96983 ...
- 【内核】探究linux内核,超详细解析子系统
Perface 前面已经写过一篇<嵌入式linux内核的五个子系统>,概括性比较强,也比较简略,现在对其进行补充说明. 仅留此笔记,待日后查看及补充! Linux内核的子系统 内核是操作系 ...
- 【Java面试题】2 Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?超详细解析
/* * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 * 答: * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的 ...
- js判断undefined类型,undefined,null, 的区别详细解析
js判断undefined类型 今天使用showModalDialog打开页面,返回值时.当打开的页面点击关闭按钮或直接点浏览器上的关闭则返回值是undefined所以自作聪明判断 var reVal ...
随机推荐
- hash-3.hashCode
1.有一个类Person,有两个字段age和name,我重写Object类的equal方法来比较两个对象的age和name是否相等,但是不重写hashCode. package com.hash; p ...
- Linux文件读写机制及优化方式
导读 Linux是一个可控性强的,安全高效的操作系统.本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只 ...
- phpcms常用标签
http://v9.help.phpcms.cn/html/pc_tag/modules/ 9帮助中心 {template "content","header" ...
- windows下vim编辑器,字符编码设置。
在windows下的vim默认字符集修改 之前使用vim编辑器的时候碰到乱码的问题,后来在网上看了记下了:在vim编辑器中按esc进入命令模式 1.修改vim内部编码 set encoding= ...
- Mac之vim普通命令使用[转]
高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的: :qx 开始记录宏,并将结果存入寄存器xq 退出记录模式@x 播放记录在x寄存器中的宏命 ...
- 2016年10月30日--JavaScript语法
1.基本数据类型:字符串.小数.整数.日期时间.布尔型等. 2.变量:[var]定义变量:var a:所有变量定义都用var定义,var是通用的可变类型. 3.类型转换:转为整数:parseInt() ...
- centos 安装gcc时,出错:Found 10 pre-existing rpmdb problem(s), 'yum check' output follows:
别人折腾的系统. 刚开始,准备安装下tornado,报错,需要安装 gcc 和 python-devel gcc安装报错,如标题所示: 谷歌了一把: http://stackoverflow.com/ ...
- JAVA调用动态链接库DLL之JNative学习
package com.ehfscliax; import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import ...
- meeting room I & II
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...
- We will be discontinuing the Nitrous Development Platform and Cloud IDE on November 14th, 2016.
我表示我很难过 Nitrous We will be discontinuing the Nitrous Development Platform and Cloud IDE on November ...