c++ 无符号bigint高精度大整数
来源:互联网 发布:不出于户 以知天下 编辑:程序博客网 时间:2024/05/01 09:03
c++ 无符号bigint高精度大整数
此代码除了减法和乘法以外均参考了刘汝佳的《算法竞赛入门经典第二版》,亲测DevC++可以编译通过。代码在codevs( codevs.cn )上通过高精度全部题目。POWERED BY PHANTOM 大神勿喷,希望大家支持!
#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<cstring>#include<string>#include<vector>using namespace std;struct bigint{ // only positive number; static const int BASE=100000000; static const int WIDTH=8; vector<int> s; //value bigint(long long num=0){ *this = num;} bigint operator = (long long num){ s.clear(); do{ s.push_back(num%BASE); num/=BASE; }while(num>0); return *this; } bigint operator = (const string& str){ s.clear() ; int x,len = (str.length()-1)/WIDTH + 1; for(int i=0;i<len;i++){ int end = str.length() - i*WIDTH; int start = max(0,end - WIDTH); sscanf(str.substr(start,end-start).c_str(),"%d",&x); s.push_back(x); } return *this; } //input&output friend ostream& operator << (ostream &out, const bigint& x){ out << x.s.back(); for(int i=x.s.size()-2;i>=0;i--){ char buf[20]; sprintf(buf,"%08d",x.s[i]); for(int j=0;j<strlen(buf);j++) out << buf[j]; } return out; } friend istream& operator >>(istream &in, bigint& x){ string s; if(!(in>>s)) return in; x=s; return in; } //compare bool operator < (const bigint& b) const { if(s.size()!=b.s.size()) return s.size() < b.s.size(); for(int i=s.size()-1;i>=0;i++) if(s[i]!=b.s[i]) return s[i] < b.s[i]; return false;//equal } bool operator > (const bigint& b) const {return b < *this;} bool operator <= (const bigint& b) const {return !(b < *this);} bool operator >= (const bigint& b) const {return !(*this < b);} bool operator != (const bigint& b) const {return b < *this || *this < b;} bool operator == (const bigint& b) const {return !(b < *this) && !(*this < b);} //calculate bigint operator +(const bigint& b) const { bigint c; c.s.clear(); for(int i=0,g=0;;i++){ if(g==0 && i>=s.size() && i>=b.s.size()) 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; } return c; } bigint operator +=(const bigint& b){ *this = *this + b; return *this; } bigint operator -(const bigint& b) const { bigint c; c.s.clear(); for(int i=0,g=0;;i++){ if(g==0 && i>=s.size() && i>=b.s.size()) break; int x=g; if(i<s.size()) x+=s[i]; if(i<b.s.size()) x-=b.s[i]; x+=BASE; c.s.push_back(x%BASE); g = x/BASE - 1; } return c; } bigint operator * (const bigint& b) const { bigint c; c.s.clear(); bigint g=0; for(int i=0;;i++){ if(g.s.size()==0 && i>=s.size()+b.s.size()-1) break; bigint x; x.s.clear() ; for(int j=0;j<g.s.size();j++) x.s.push_back(g.s[j]); if(i<s.size()+b.s.size()-1){ for(int j = max(0 , i-(int)s.size()+1);j<=min(i,(int)b.s.size()-1);j++){ bigint t = (long long)b.s[j]*s[i-j]; x += t; } } c.s.push_back(x.s[0]); g.s.clear(); if(x.s.size()>1) for(int j=1;j<x.s.size();j++) g.s.push_back(x.s[j]); } return c; }};
以上是全部代码,将bigint封装在一个结构体里面了。支持比较运算符,加减乘运算,支持cin、cout流式输入输出,但是不能把bigint和一般int进行除了赋值以外的运算。
完整的程序代码下载:http://download.csdn.net/detail/a1323933782/9802948
谢谢支持!
0 0
- c++ 无符号bigint高精度大整数
- C语言无符号整数高精度算法试写
- [C++]第七次作业:实现一个大整数类BigInt
- 再回首-无符号大整数加法
- c语言高精度大整数加法运算
- C语言中的无符号整数
- 高精度 大整数加法
- 高精度大整数加法
- 高精度大整数类
- 大整数高精度加减乘除
- 高精度大整数模板
- 【高精度】大整数类
- 有符号整数、无符号整数的转换以及小数据转换为大数据
- 无符号整数--问题
- 无符号整数
- 无符号整数
- 一个大整数运算类源码(BigInt)
- 有符号整数与无符号整数
- CSS学习笔记ing
- FZU 2218 Simple String Problem (状压DP解决集合不相同元素问题)
- Android学习笔记——SharedPreferences存储
- 考研英语近义词与反义词·一
- 2017.4.3 机房测试 (并查集,最短路,拓扑排序,最小生成树)
- c++ 无符号bigint高精度大整数
- 计算叉积
- 反射
- Android自定义类似ProgressDialog效果的Dialog
- 接触laravel第一周
- Java程序员成长的思考
- linux设备驱动模型
- 判断两线段相交
- Struts2架构中参数的封装