前言:
大数的操作大部分人都知道,而且网上也有许多代码,但是那些大多比较冗长,吓到了许多同学们。。。所以特意写了个比较简短易懂的代码,代码基本上没问题,不过只支持正整数的输入数据。
样例:
12345 12
add:12357
subtract:12333
multiply:148140
devide:1028 remainder:9
power:12528328468279800008275836185265394560488525390625
[cpp]
view plain
copy
print
?
- #include<cstdio>
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- usingnamespacestd;
- #defineSWAP(a,b)stringc;c=a;a=b;b=c//交换字符串
- intcompare(stringa,stringb){//大数比较
- if(a.length()<b.length()){
- return0;
- }elseif(a.length()==b.length()){
- if(a<b)return0;
- }return1;
- }
- stringadd(stringa,stringb){//大数加法
- if(!compare(a,b)){SWAP(a,b);}//保证a的长度大于b
- int*ad=newint[a.length()+1];
- memset(ad,0,sizeof(int)*(a.length()+1));//初始化
- inti,j;
- for(i=0;i<a.length()-b.length();i++)//将a长度大于b的部分传过去
- ad[i+1]=a[i]-‘0’;
- for(j=0;i<a.length();i++,j++)//将a与b匹配的部分相加再传
- ad[i+1]=a[i]-‘0’+b[j]-‘0’;
- for(i=a.length();i>0;i–){//进位操作
- if(ad[i]>9){
- ad[i-1]+=ad[i]/10;
- ad[i]%=10;
- }
- }
- char*c=newchar[a.length()+1];//定义一个字符数组保存结果
- i=0,j=0;
- while(ad[i]==0)i++;//去除前导0
- while(i<a.length()+1)c[j++]=ad[i++]+‘0’;
- c[j]=‘\0’;
- if(c[0]==‘\0’){c[1]=‘\0’;c[0]=‘0’;}//如果结果为0
- free(ad);//释放ad数组
- strings(c);//将c转换成string类型
- returns;
- }
- stringsubtract(stringa,stringb){
- intflag=0,i,j;
- if(!compare(a,b)){//如果a<b,交换a、b并标识结果为负
- flag=1;
- SWAP(a,b);
- }
- int*su=newint[a.length()];
- memset(su,0,sizeof(int)*a.length());//初始化
- for(i=0;i<a.length()-b.length();i++)//将a长度大于b的部分传过去
- su[i]=a[i]-‘0’;
- for(j=0;i<a.length();i++,j++)//将a与b匹配的部分相减再传
- su[i]=a[i]-b[j];
- for(i=a.length()-1;i>0;i–){//进位操作
- if(su[i]<0){
- su[i-1]–;
- su[i]+=10;
- }
- }
- char*c=newchar[a.length()+2];
- i=0,j=0;
- if(flag)c[j++]=‘-‘;//如果是负数,c[0]=’-‘
- while(su[i]==0)i++;//后面同加法
- while(i<a.length())c[j++]=su[i++]+‘0’;
- c[j]=‘\0’;
- if(c[0]==‘\0’){c[1]=‘\0’;c[0]=‘0’;}
- free(su);
- strings(c);
- returns;
- }
- stringmultiply(stringa,stringb){
- int*mu=newint[a.length()+b.length()];
- memset(mu,0,sizeof(int)*(a.length()+b.length()));
- for(inti=0;i<a.length();i++)//将数字两两相乘
- for(intj=0;j<b.length();j++)
- mu[i+j+1]+=(a[i]-‘0’)*(b[j]-‘0’);
- for(inti=a.length()+b.length()-1;i>0;i–){//进位操作
- if(mu[i]>9){
- mu[i-1]+=mu[i]/10;
- mu[i]%=10;
- }
- }
- //后面同加法
- char*c=newchar[a.length()+b.length()];
- inti=0,j=0;
- while(mu[i]==0)i++;
- while(i<a.length()+b.length())c[j++]=mu[i++]+‘0’;
- c[j]=‘\0’;
- if(c[0]==‘\0’){c[1]=‘\0’;c[0]=‘0’;}
- free(mu);
- strings(c);
- returns;
- }
- string*devide(stringa,stringb){
- string*de=newstring[2];
- de[0]=“0”;de[1]=b;
- stringone=“1”,ten=“10”;
- if(!compare(a,b))returnde;
- while(a[0]!=‘-‘){
- de[1]=a;
- a=subtract(a,b);
- de[0]=add(de[0],one);
- }
- de[0]=subtract(de[0],one);
- returnde;
- }
- stringpower(stringa,stringb){
- stringc=“1”,one=“1”;
- while(b[0]!=‘0’){
- c=multiply(c,a);
- b=subtract(b,one);
- }
- returnc;
- }
- intmain(intargc,charconst*argv[]){
- stringa,b,c1,c2,c3,c5;
- string*c4;
- intcas;
- cin>>cas;
- while(cas–){
- cin>>a>>b;
- c1=add(a,b);
- c2=subtract(a,b);
- c3=multiply(a,b);
- c4=devide(a,b);
- c5=power(a,b);
- cout<<“add:”<<c1<<endl<<“subtract:”<<c2<<endl
- <<“multiply:”<<c3<<endl<<“devide:”<<c4[0]<<“remainder:”<<c4[1]<<endl
- <<“power:”<<c5<<endl;
- }
- return0;
- }