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 ...
随机推荐
- 【C语言入门教程】5.2 函数的作用域规则(auto, static)
作用域规则是指代码或数据的有效使用范围.C语言将函数作为独立的代码块,函数之间不能相互访问其内部的代码或数据.函数间数据的传递只能通过接口实现.但是,变量的定义方法可改变函数的作用域规则,可将变量分为 ...
- ORACLE连接字符串里每个参数的具体意思
1.数据库名(db_name):数据库名是存储在控制文件中的数据库的名称.它代表的是数据库也就是所有构成数据库的物理文件的总称.要修改这个名称,只要重建控制文件就行了.2.实例名:实例名指的是用于响应 ...
- springmvc之hibernate整合
1.项目结构 2.所需jar包 3.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-a ...
- DateEdit和TimeEdit用法
DateEdit 控件默认情况下,显示的只有日期,没有时间.下面介绍2中日期和时间同时显示的方法: 1.Properties.VistaDisplayMode 为true, 2.Properties. ...
- 联不上网 Unable to initialize Windows Sockets interface. General failure.
电脑莫名联不上网 Unable to initialize Windows Sockets interface. General failure. Unable to initialize the W ...
- linux 下开放端口问题
Linux安装Tomcat后本地可以正常访问,可是这时Tomcat还不能被外界访问需要在Linux默认防护墙上打开8080端口 打开 /etc/sysconfig/iptables [root@l ...
- HDU 4939 Stupid Tower Defense(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4939 解题报告:一条长度为n的线路,路上的每个单元格可以部署三种塔来给走在这条路上的敌人造成伤害,第一 ...
- iOS开发——UI基础-Xcode资源拷贝
#1.拷贝资源的时候选择的copy的含义: 是否要将资源拷贝一份到项目中, 如果不勾选就代表着不拷贝, 那么原来的资源不见了, 项目中的也不能用了 注意: 1.虽然项目中的图片和外部的图片是同一张图片 ...
- BZOJ1500——维修序列
动态的最大子段和 就是splay啊,说一下GSS1吧,维护四个值,一个是这个区间和(下面说sum), 一个是从左边开始的最大和(下面说ls)和右边开始的最大和(下面说rs), 还有一个就是最大区间和( ...
- js刷新页面的几种方法
history.go(0) location.reload() location=location location.assign(location) document.execCommand('Re ...