#include <iostream.h>
#include <malloc.h>
#include <iomanip.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
struct Larger
{
int length;
int flag;//+ -
char data[200];
};
///input/
void getdata(Larger& d1,Larger& d2);
void printdata(Larger d);
void adddata(Larger& d1,Larger& d2,Larger& d);
void reversedata(Larger& d);
void minusLdata(Larger& d1,Larger& d2,Larger& d);
void dividedata(Larger d,Larger &left,Larger &right);
void multidata(Larger d1,Larger d2,Larger& d);
void powerdata(Larger& d,int length);
int main()
{
Larger data1,data2;
Larger Sum,Minus,Div1,Div2,Multi;
getdata(data1,data2);
printdata(data1);cout<<endl;
printdata(data2);cout<<endl;
adddata(data1,data2,Sum);
minusLdata(data1,data2,Minus);
multidata(data1,data2,Multi);
return 0;
}
void getdata(Larger& d1,Larger& d2)
{
int i=0;
cout<<"Input the first data:"<<endl;
cin>>d1.data;
d1.length=strlen(d1.data);
d1.flag=0;
cout<<"Input the second data:"<<endl;
cin>>d2.data;
d2.length=strlen(d2.data );
d2.flag=0;
reversedata(d1);
reversedata(d2);
}
void reversedata(Larger& d)
{
int i=0;
char swap;
for(i=0;i<d.length-i;i++)
{
swap=d.data[i];
d.data[i]=d.data[d.length-i-1];
d.data[d.length-i-1]=swap;
}
for(i=0;i<d.length;i++)d.data[i]=d.data[i]-'0';
}
void printdata(Larger d)
{
int i=0;
i=d.length-1;
if(i==0)
{
if(d.flag==1)printf("-");
printf("%d",d.data[i]);
}
else
{
if(d.flag==1)printf("-");
while(d.data[i]==0)i--;
for(;i>=0;i--)
{
printf("%d",d.data[i]);
}
}
}
void adddata(Larger& d1,Larger& d2,Larger& d)
{
int carry=0;
int i=0;
if(d1.flag+d2.flag==1)
{
if(d2.flag==1)
{
d2.flag=0;
minusLdata(d1,d2,d);
d2.flag=1;
}
else if(d1.flag==1)
{
d1.flag=0;
minusLdata(d2,d1,d);
d1.flag=1;
}
}
else
{
d.flag=d1.flag;
if(d1.length>=d2.length)
{
d.length=d1.length;
for(i=d2.length;i<d1.length;i++)d2.data[i]=0;
}
if(d2.length>d1.length)
{
d.length=d2.length;
for(i=d1.length;i<d2.length;i++)d1.data[i]=0;
}
for(i=0;i<d.length;i++)
{
d.data[i]=d1.data[i]+d2.data[i]+carry;
if(d.data[i]>9){d.data[i]=d.data[i]-10;carry=1;}
else carry=0;
}
if(carry==1)
{
d.length=d.length+1;
d.data[d.length-1]=1;
}
}
printdata(d1);
printf("+");
printdata(d2);
printf("=");
printdata(d);
printf("/n");
}
void minusLdata(Larger& d1,Larger& d2,Larger& d)
{
int flag1,flag2;
int len1,len2;
int i=0;
int j=0;
int bring=0,carry=0;
Larger dd;
flag1=d1.flag;flag2=d2.flag;
d.flag=flag1;
d.length=0;
if(d1.flag+d2.flag==1)
{
len1=(d1.length>d2.length)?d1.length:d2.length;
if(d2.flag==1)
{
d2.flag=0;
adddata(d1,d2,d);
d2.flag=1;
}
else if(d1.flag==1)
{
d1.flag=0;
adddata(d2,d1,d);
d1.flag=1;
}
}
else
{
len1=d1.length;
len2=d2.length;
if(len1<len2)
{
for(i=len1;i<len2;i++){d1.data[i]=0;}
len1=len2;
}
if(len2<len1)
{
for(i=len2;i<len1;i++){d2.data[i]=0;}
}
carry=0;
bring=0;
d.flag=d1.flag;
for(i=0;i<len1;i++)
{
d.data[i]=d1.data[i]-d2.data[i]-carry;
dd.data[i]=d2.data[i]-d1.data[i]-bring;
if(d.data[i]<0){carry=1;d.data[i]=d.data[i]+10;}
else carry=0;
if(dd.data[i]<0){bring=1;dd.data[i]=dd.data[i]+10;}
else bring=0;
}
if(carry==1){d=dd;d.flag=1-d1.flag;}
}
if(d.data[len1-1]==0)
{
i=1;
while(d.data[len1-i]=0&&i<len1-1&&i!=1)i++;
d.length=len1-i;
if(d.length==0)d.length=1;
}
else d.length=len1;
printdata(d1);
printf("-");
printdata(d2);
printf("=");
printdata(d);
printf("/n");
}
void dividedata(Larger d,Larger &left,Larger &right)
{
int halflen=0;
int i=0;
halflen=d.length/2;
for(i=0;i<halflen;i++)right.data[i]=d.data[i];
for(;i<d.length;i++)left.data[i-halflen]=d.data[i];
left.length=d.length-halflen;
right.length=halflen;
printdata(left);
printf("/n");
left.flag=d.flag;
right.flag=d.flag;
}
void powerdata(Larger& d,int length)
{
int i=0;
for(i=d.length-1;i>=0;i--)d.data[i+length]=d.data[i];
for(i=length-1;i>=0;i--)d.data[i]=0;
d.length=d.length+length;
printdata(d);
printf("/n");
}
void multidata(Larger d1,Larger d2,Larger& d)
{
int carry=0;
int i=0;
Larger temp;
Larger left1,left2,right1,right2;
Larger m1,m2,m3,minus1,minus2,sum,sum2;
m3=NULL;
d.flag=0;
if(d1.flag!=d2.flag)d.flag=1;
if(d1.length==1||d2.length==1)
{
d.length=(d1.length>d2.length)?d1.length:d2.length;
if(d2.length==1){temp=d2;d2=d1;d1=temp;}
if(d1.length==1)
{
for(i=0;i<d.length;i++)
{
d.data[i]=d1.data[0]*d2.data[i]+carry;
carry=d.data[i]/10;
if(carry>0)d.data[i]=d.data[i]%10;
}
if(carry>0)
{
d.data[d.length]=carry;
d.length=d.length+1;
}
}
}
else
{
if(d1.length>d2.length) {for(i=d2.length;i<d1.length;i++)d2.data[i]=0;d2.length=d1.length;}
else {for(i=d1.length;i<d2.length;i++)d1.data[i]=0;d1.length=d2.length;}
划分数据
dividedata(d1,left1,right1);
划分数据
dividedata(d2,left2,right2);
高位相乘
multidata(left1,left2,m1);
低位相乘
multidata(right1,right2,m2);
得到中间计算结果
minusLdata(right1,left1,minus1);
minusLdata(left2,right2,minus2);
/计算中间乘积
multidata(minus1,minus2,sum);
adddata(sum,m1,sum2);
adddata(sum2,m2,sum);
powerdata(m1,right1.length*2);
powerdata(sum,right1.length);
adddata(m1,sum,sum2);
adddata(sum2,m2,d);
}
printdata(d1);
printf("*");
printdata(d2);
printf("=");
printdata(d);
printf("/n");
}