#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;
}