#include<iostream> #include<string.h> const int N=1001; using namespace std; typedef struct DATA{ int num[N]; int sign; int len; }DATA; //将输入的char型大数数组 转化 为int型大数数组 DATA chartoint(DATA &data,char *str) { memset(data.num, 0, sizeof(data.num));//要把大于data.len的那些位置0。。 data.len=strlen(str); for(int i=0;i<data.len;i++) data.num[i]=(int)str[i]-'0'; return data; } //data成员的初始化 同时 将data.num[] chartoint void initialise(DATA &data,char* str) { //对sign赋值,并去符号 if(str[0]=='-') { data.sign=-1; int len=strlen(str); for( int i=0; i<len-1; i++) str[i]=str[i+1]; str[len-1]='\0'; } else data.sign=1; chartoint(data,str); } //翻转大数 DATA turnstr(DATA &data) { int t; int midlen=data.len/2; int lastnum=data.len-1; for(int i=0;i<midlen;i++) { t=data.num[i]; data.num[i]=data.num[lastnum]; data.num[lastnum]=t; lastnum--; } return data; } //比较两个大数绝对值的大小 int max(DATA data1,DATA data2) { if(data1.len>data2.len) return 1; if(data1.len<data2.len) return 2; else { for(int i=0;i<data1.len;i++) { if(data1.num[i]>data2.num[i]) { return 1;} if(data1.num[i]<data2.num[i]) { return 2;} } return 0; } } //符号运算,只处理两数运算后的符号 //程序将两个大数之间的符号运算和数字运算分开 // fuhao(data1,data2,choice,m); void fuhao (DATA data1,DATA data2 ,char choice, int m) { if(choice=='1') //加法 { if(data1.sign>data2.sign) { if(m==2)cout<<"-"; } //1+(-2) if(data1.sign<data2.sign) { if(m==1)cout<<"-"; } //(-2)+1 if(data1.sign==-1 && data2.sign==-1) cout<<"-"; } if(choice=='2') //减法 { if(data1.sign<data2.sign) cout<<"-"; if(data1.sign==1 && data2.sign==1) { if(m==2)cout<<"-"; } if(data1.sign==-1 && data2.sign==-1) { if(m==1)cout<<"-"; }//(-2)-(-1) } if(choice=='3') { if(data1.sign*data2.sign==-1)cout<<"-"; } } //输出大数 //并把数字开头多余的0去掉 void output(DATA data) { int i=0; Fix:if(data.num[i]==0) { i++; goto Fix; } for( ;i<data.len;i++) cout<<data.num[i]; cout<<endl; } //加法 DATA plus(DATA &data1,DATA &data2,DATA &data) { int maxlen=(data1.len>=data2.len)?data1.len:data2.len; data.len=maxlen; int add=0; for(int i=0;i<maxlen;i++) { //如果前边不置0,当长度不同时这里就会有问题。 //例如1+10, 会变成x1+10, 其中x是个随机数, 所以出来的答案就错了。。 data.num[i]=(data1.num[i]+data2.num[i]+add) %10; if(data1.num[i]+data2.num[i]+add >=10) add=1; else add=0; } if (add==1) //加完最后一位还要进位的情况 { data.len++; data.num[data.len-1]=1; } return data; } //减法 DATA minus(DATA &data1,DATA &data2,DATA &data) { //这里的减法只处理同号且data1.num>=data2.num的情况 int maxlen=(data1.len>=data2.len)?data1.len:data2.len; data.len=maxlen; int borrow=0; for(int i=0;i<maxlen;i++) { data.num[i]=(data1.num[i]-borrow -data2.num[i] +10) %10; if(data1.num[i]-borrow -data2.num[i] <0) borrow=1; else borrow=0; } return data; } //乘法 DATA multiply(DATA &data1,DATA &data2,DATA &data) { int *p=data.num; data.len=data1.len+data2.len; p=(int *)malloc((data.len)*sizeof(int)); for(int i=0;i<data.len;i++) data.num[i]=0; int add=0; for(int i2=0;i2<data2.len;i2++){ for(int i1=0;i1<data1.len;i1++){ data.num[i1+i2]=( data.num[i1+i2] +(data1.num[i1]*data2.num[i2]) +add)%10; add= (int)((data.num[i1+i2] +(data1.num[i1]*data2.num[i2]) +add)/10); } } return data; } int main() { DATA data1,data2,data; char str1[N],str2[N]; cout<<"请输入两个大数:"<<endl; gets(str1); gets(str2); initialise(data1,str1); initialise(data2,str2); int m; m=max(data1,data2); cout<<"请选择要进行的运算:(加法输入:1 减法输入:2 乘法输入:3)"<<endl; char choice; choice=getchar(); if(choice=='1') { cout<<endl<<"********************************************"<<endl; puts(str1); cout<<"+"<<endl; puts(str2); cout<<"="<<endl; fuhao(data1,data2,choice,m); if(data1.sign==data2.sign) output(turnstr(plus( turnstr(data1), turnstr(data2),turnstr(data)))); else { if(m==1) output(turnstr(minus( turnstr(data1), turnstr(data2),turnstr(data)))); else output(turnstr(minus( turnstr(data2), turnstr(data1),turnstr(data)))); } cout<<"********************************************"<<endl<<endl; } if(choice=='2') { cout<<endl<<"********************************************"<<endl; puts(str1); cout<<"-"<<endl; puts(str2); cout<<"="<<endl; fuhao(data1,data2,choice,m); //同号相减调用减法,异号相减调用加法 if(data1.sign!=data2.sign) output(turnstr(plus( turnstr(data1), turnstr(data2),turnstr(data)))); else { if(m==1) output(turnstr(minus( turnstr(data1), turnstr(data2),turnstr(data)))); else output(turnstr(minus( turnstr(data2), turnstr(data1),turnstr(data)))); } cout<<"********************************************"<<endl<<endl; } if(choice=='3') { cout<<endl<<"********************************************"<<endl; puts(str1); cout<<"*"<<endl; puts(str2); cout<<"="<<endl; fuhao(data1,data2,choice,m); output(turnstr(multiply( turnstr(data1),turnstr(data2),turnstr(data)))); } return 0; }