大整数的四则运算高质量C语言程序Word格式文档下载.docx
《大整数的四则运算高质量C语言程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《大整数的四则运算高质量C语言程序Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
两个正整数相乘
7.voidprint(longc[],intflag)
功能说明:
打印带符号flag(1为负)的longc[]数组
8.intwrite(longa[],intflag)
将键盘敲入的数字按4位一组放入longa[],且将符号放入flag
9.voidmul(longa[],intfirst,intlast,longb[],longc[])
乘法,a的第last到first位乘以b,答案放到c
10.intcompara(longa[],intfirst,intlast,longb[])
比较数组a,b大小,firstlast分别为a的最高最低位
11.intminusd(longa[],intfirst,intlast,longb[],longc[],intflag)
a为被减数,firstlast为a最高最低位,b为减数,c为差,flag为符号
12.voiddiv(longa[],longb[],longc[],intfa)
除法,a除以b的值放入c,fa为a符号
13.voidmenu()
打印菜单函数
14.voidmain()
主函数,调用其余函数,计算相应功能的值并输出。
5.源程序:
#include<
iostream.h>
math.h>
stdio.h>
#defineMAX40//可以修改,此时最大运算位数为四十位
#defineN10//此处应为最大位数除以4
voidinit(inta[],intb[],int*p1,int*p2)//输入
{
inti,j;
charr,s;
for(i=0;
i<
MAX;
i++)
{
a[i]=0;
b[i]=0;
}
printf("
请输入处理的第一个数的值:
"
);
r=getchar();
if(r==45)
a[0]=r;
for(i=1;
(r=getchar())!
='
\n'
;
a[i]=r-48;
else
a[1]=r-48;
for(i=2;
*p1=i;
请输入处理的第二个数的值:
s=getchar();
if(s==45)
b[0]=s;
for(j=1;
(s=getchar())!
j++)
b[j]=s-48;
b[1]=s-48;
for(j=2;
*p2=j;
}
intplus(inta[],intb[],intc[],intm,intn)//加法运算
intd[MAX]={0},i,j,k;
i++)c[i]=0;
if(a[1]==0)
for(i=0;
n;
i++)c[i]=b[i];
return(i);
if(b[1]==0)
m;
i++)c[i]=a[i];
for(i=m-1,j=n-1,k=1;
i>
0&
&
j>
0;
i--,j--,k++)
d[k]=a[i]+b[j]+d[k];
if(d[k]>
9)
d[k+1]++;
d[k]=d[k]-10;
while(i>
0)
d[k]=d[k]+a[i];
9)
k++;
i--;
}
while(j>
d[k]=d[k]+b[j];
if(d[k]>
{
d[k+1]++;
}
k++;
j--;
d[0]=a[0]+b[0];
c[0]=d[0];
if(d[k]==0)
k--;
for(i=1;
k>
i++,k--)
c[i]=d[k];
return(i);
voidchange(inta[],intb[],intm,intn)//变号运算
intc[MAX];
if(m<
=n&
b[0]==45)
c[i]=a[i];
for(i=1,j=1;
j<
i++,j++)
a[i]=b[j];
b[i]=c[j];
for(j=i;
b[j]=0;
return;
if(m>
a[0]==45)
a[0]=0;
b[0]=45;
intminus(inta[],intb[],intd[],intm,intn)//减法运算
intc[MAX]={0},i,j,k;
d[i]=0;
i--,j--,k++)
if(c[k]<
0||a[i]<
b[j])
c[k]=c[k]+a[i]-b[j];
if(c[k]<
0)
{
c[k]+=10;
c[k+1]--;
}
elsec[k]=a[i]-b[j];
c[k]=c[k]+a[i];
if(c[k]<
c[k]+=10;
c[k+1]--;
i--;
c[k]=a[i]+c[k];
while(c[k]<
=0&
i++)
d[i]=c[k--];
voidminusfun(inta[],intb[],intd[],intm,intn)//判断是否两异号数相加
inti,j,f=0,g=0;
if(b[0]!
=0)printf("
-"
printf("
%d"
b[i]);
printf("
\n"
if(a[0]!
=0)
a[i]);
if(m==n)
if((a[i]<
b[i]&
b[0]==45)||(a[i]>
a[0]==45))
g=1;
if(a[i]!
=b[i])f=1;
if(f==0)
0\n"
if(g==1)
change(a,b,m,n);
j=minus(a,b,d,n,m);
j;
i++)printf("
d[i]);
return;
elseif(a[0]==45&
b[0]==0)
j=minus(b,a,d,n,m);
else
j=minus(a,b,d,m,n);
n&
b[0]==45)
return;
a[0]==45)
j=minus(b,a,d,n,m);
intmulti(inta[],intb[],intc[],intm,intn)//正整数乘法运算
intd[MAX]={0},e[MAX]={0},i,j,k,r,s,x,y;
c[i]=0;
=n)
for(i=m-1,s=1;
i--,s++)
for(r=0;
r<
r++){d[r]=0;
e[r]=0;
for(j=n-1,k=1*s;
j--,k++)
d[k]=a[i]*b[j]+d[k];
9){d[k+1]=d[k+1]+d[k]/10;
d[k]=d[k]%10;
y=k;
for(r=1;
r++,k--)
e[r]=d[k];
r++)
d[r]=e[r];
if(s==1)
x=plus(c,d,e,0,y+1);
x=plus(c,d,e,y,y+1);
r++)
c[r]=e[r];
elseif(m>
n)
for(j=n-1,s=1;
j--,s++)
d[r]=0;
for(i=m-1,k=1*s;
i--,k++)
d[k+1]=d[k+1]+d[k]/10;
d[k]=d[k]%10;
return(x);
voidprint(longc[],intflag)//输出
inti;
for(i=N-1;
=0;
i--)
if(c[i])
break;
if(flag)
%4d"
c[i--]);
for(;
i--)
{
if(c[i]/1000)
%4ld"
c[i]);
elseif(c[i]/100)
0%3ld"
elseif(c[i]/10)
00%2ld"
000%1ld"
intwrite(longa[],intflag)//将键盘敲入的数字按4位一组放入longa[],且将符号放入flag
charnum[N*4];
chartemp;
inti,j,k;
N*4;
num[i]=getchar();
if(num[i]==10)
{
i--;
break;
if(num[i]==45)
flag=(flag+1)%2;
k=0;
for(j=0;
=i/2;
temp=num[j];
num[j]=num[i-k];
num[i-k]=temp;
k=1;
=i;
j++)
switch(k)
case1:
a[j/4]+=(long)(num[j]-48);
case2:
a[j/4]+=(long)(num[j]-48)*10;
case3:
a[j/4]+=(long)(num[j]-48)*100;
case4:
a[j/4]+=(long)(num[j]-48)*1000;
returnflag;
voidmul(longa[],intfirst,intlast,longb[],longc[])//乘法
intmax_i;
longtemp;
for(max_i=N-1;
max_i>
max_i--)
if(b[max_i])
=max_i;
if(b[i])
for(j=first;
=last;
temp=a[j]*b[i];
c[i+j-first]+=temp%10000;
c[i+j-first+1]+=((temp/10000)+(c[i+j-first]/10000));
c[i+j-first]=c[i+j-first]%10000;
intcompara(longa[],intfirst,intlast,longb[])//比较数组a,b大小
intflag=2;
intk=0;
intlen;
for(len=N-1;
len>
len--)
if(b[len])
if((first-last)>
=len)
if((first-last)>
len)
flag=1;
else
for(i=len;
{
if(a[first-k]>
b[i])
{
flag=1;
break;
}
if(a[first-k]<
flag=0;
}
else
flag=0;
return
flag;
intminusd(longa[],intfirst,intlast,longb[],longc[],intflag)
intnotchange;
inti,k=0;
intmax;
notchange=compara(a,first,last,b);
if(notchange)
for(i=last;
=first;
if(a[i]<
b[k])
{
a[i]+=10000;
a[i+1]--;
c[i]=a[i]-b[k];
k++;
flag=(flag+1)%2;
for(max=N-1;
max>
max--)
if(b[max])
break;
for(i=0;
=max;
if(b[i]<
a[last+k])
b[i]+=10000;
b[i+1]--;
c[i]=b[i]-a[last+k];
k++;
voiddiv(longa[],longb[],longc[],intfa)//除法
longresult[N+1]={0};
intlen_a;
intk;
print(a,fa);
for(len_a=N-1;
len_a>
len_a--)
if(a[len_a])
k=len_a;
while(compara(a,len_a,0,b))
while(!
compara(a,len_a,k,b))
k--;
c[k]=1;
mul(c,k,k,b,result);
while(compara(a,len_a,k,result)){
c[k]++;
for(i=N-1;
result[i]=0;
mul(c,k,k,b,result);
c[k]--;
for(i=N-1;
result[i]=0;
minusd(a,len_a,k,result,a,0);
for(len_a=N-1;
if(a[len_a])
break;
k=len_a;
voidmenu()//菜单
==================================大整数计算器=================================="
1.加法2.减法3.乘法4.除法0.退出\n"
请从1~4中选择:
voidmain()//主函数
intflag;
intfa;
intfb;
longad[N],bd[N],cd[2*N];
inta[MAX]={0},b[MAX]={0},c[MAX]={0},d[MAX]={0};
chars;
intm,n,i,j;
int*p1,*p2;
p1=&
p2=&
menu();
getchar();
w