C++大整数相关操作
来源:互联网 发布:mac pro 2016价格 编辑:程序博客网 时间:2024/05/16 11:59
要求:设计一个十进制位数超过得以达到1000位的非负大整数运算类。要求该大整数类能实现大整数的初始化、输入输出、大整数的加法运算、大整数的减法运算、大整数的除法运算(只取商数部分)、大整数的取余运算、大整数与int型整数的加、减、乘、除、取余运算。
#include<iostream>
#include<sstream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
string const add(const string &a,const string &b); //自然数加法
string const multiply(const string &a,char b); //自然数简单乘法
string const multi(const string &a,const string &b); //自然数乘法
string const sub(const string &a,const string &b); //自然数减法
string const div(const string &a,const string &b,string &t); //自然数除法
bool LessEqual(const string &a,const string &b);
string const factorial(int n); //自然数阶乘
int main(){
cout<<add("12345678998765432112330","343432112345678655235")<<endl;
cout<<sub("9234759374957934781435","1293479237482374827")<<endl;
cout<<multi("92734927387123712334","340680289348938932")<<endl;
cout<<multiply("23972387293782378323",'5');
string t;
cout<<div("12345678998765432112345678998765","293797238",t)<<endl;
cout<<t<<endl;
cout<<boolalpha<<LessEqual("2927398","23923792378")<<endl;
cout<<factorial(21);
}
string const div(const string &a,const string &b,string& t){
if(b=="0")
return "error";
vector<string> x; string r; char j;
for(char i='9';i>='0';--i)
x.push_back(multiply(b,i));
for(int i=0;i != a.size();++i){
t.append(1,a[i]);
for(j='9';j>='0';--j)
if(LessEqual(x['9'-j],t))
break;
r.append(1,j);
t=sub(t,x['9'-j]);
t.erase(0,t.find_first_not_of('0'));
}
r.erase(0,r.find_first_not_of('0'));
if(t.empty()) t="0";
if(r.empty()) r="0";
return r;
}
string const add(const string &a,const string &b){
string sh,lo,r; int g=0;
if(a.size()>b.size()){
sh=string(a.size()-b.size(),'0');
sh+=b; lo=a;
}
else{
sh=string(b.size()-a.size(),'0');
sh+=a; lo=b;
}
r.resize(sh.size());
for(int i=static_cast<int>(sh.size()-1);i>=0;--i){
r[i]=sh[i]+lo[i]-48+g;
if(r[i]>'9'){
r[i]-=10;
g=1;
}
else{
g=0;
}
}
if(g==1)
r="1"+r;
return r;
}
string const multiply(const string &a,char b){
string r;
r.resize(a.size()); int g=0;
if(b=='0')
return "0";
if(b=='1') //加快计算
return a;
for(int i=static_cast<int>(a.size()-1);i>=0;--i){
r[i]=(a[i]-48)*(b-48)%10+48+g;
if(r[i]>'9')
{
r[i]-=10;
g=((a[i]-48)*(b-48))/10+1;
continue;
}
g=((a[i]-48)*(b-48))/10;
}
if(g!=0)
r.insert(0,string(1,g+48));
return r;
}
string const multi(const string &a,const string &b){
string r("0");
string *c=new string[b.size()];
for(int i=0;i!=b.size();++i){
c[i]=multiply(a,b[b.size()-1-i])+string(i,'0');
r=add(r,c[i]);
}
delete[] c;
return r;
}
string const factorial(int n){
string r="1";
for(int i=1;i!=n+1;++i){
ostringstream o; o<<i;
r=multi(r,o.str());
}
return r;;
}
bool LessEqual(const string &a,const string &b){
if(a.size()>b.size()){
return false;
}
else if(a.size()<b.size()){
return true;
}
else{
return !lexicographical_compare(b.begin(),b.end(),a.begin(),a.end());
}
}
string const sub(const string &a,const string &b){
string sh,lo,r; int g=0;
if(a.size()>b.size()){
sh=string(a.size()-b.size(),'0');
sh+=b; lo=a;
}
else if(a.size()<b.size()){
sh=string(b.size()-a.size(),'0');
sh+=a; lo=b;
}
else { //长度相等
if(a<b){
sh=a;lo=b;
}
else{
sh=b;lo=a;
}
}
r.resize(sh.size());
for(int i=static_cast<int>(sh.size()-1);i>=0;--i){
int x= r[i]=lo[i]-sh[i]+48-g;
if(r[i]<'0'){
r[i]+=10;
g=1;
}
else{
g=0;
}
}
r.erase(0,r.find_first_not_of('0'));
if(r.empty())
r="0";
return r;
}
本文摘自: http://wenwen.soso.com/z/q201289013.htm
- C++大整数相关操作
- 玩儿转C语言:整数及相关操作
- 大整数操作
- C 大整数相加
- BigDecimal类+大整数操作
- Java中的大整数操作
- 线性表- 大整数操作
- 大数据相关操作
- [C语言]大整数乘法
- 大整数乘法(C)
- 大整数乘法c语言版
- 大整数加减乘除 c实现
- C语言-大整数四则运算
- 大整数乘法c语言
- 基于C++的大整数运算操作
- 文件相关操作[C#]
- C文件相关操作
- c-bit相关操作
- 面向开发人员的windows vs linux
- 汇编语言资料
- vim中xml文件的缩进
- CPU常见寄存器介绍
- vim下groovy缩进插件
- C++大整数相关操作
- LoadRunner脚本中的协议选择
- SSH:加密传输
- 《that's the hardest part》
- s3c6410烧写相关
- elipse 快截键
- DirectShow的filterGrabber编译
- emacs学习(3) 高级 Emacs 文本操作
- 学习心得