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

原创粉丝点击