大整数的四则运算高质量C语言程序.docx
《大整数的四则运算高质量C语言程序.docx》由会员分享,可在线阅读,更多相关《大整数的四则运算高质量C语言程序.docx(27页珍藏版)》请在冰豆网上搜索。
大整数的四则运算高质量C语言程序
设计题目:
大整数的四则运算
1.功能简介:
编写出实现大整数之间相加,相减,相乘,相除的程序,并输出计算结构。
课程设计要求:
采用模块化程序设计
源程序中应有足够的注释
必须上机调试通过
注重算法运用,优化存储效率与运算效率
需提交源程序(含有注释)及相关文件(数据或数据库文件);
提交设计报告书。
2.总体结构:
流程图:
3.概要设计:
1)加法运算
利用两个整形数组分别存放两个数a和b的每一位的数值,最低位存放符号。
如果a和b同号,从最低为开始计算,如果有进位则保存在高一位,本为则减10,然后反序将计算后的各个位的数值保存在一个数组c并输出,如果a和b都是负数则在前面要输出负号,函数的返回值为c的位数。
如果a和b异号,也即两个正整数相减,从最低位开始相减,如果要借位则本位加10再相减,高一位要减1,然后反序将计算后的各个位的数值保存在一个数组c并输出,在前面要输出相应的符号位。
2)减法运算
可将减法运算转化为加法运算,只要将被减数的符号改变即可。
3)乘法运算
符号存放在最低位,将其中一个数a的每一位分别乘以另一个数b的每一位,并将结果保存在数组c中,然后重复计算a的下一位跟b的每一位的乘积,把上一次计算保存在c的值加上本次计算后的值,并保存在c自身中,直到a的最高位,最后输出符号和相应的计算结果。
4)除法运算
利用乘法和减法,将除数分别乘以1到9,直到其值大于等于被除数的对应的数,然后被除数对应的数减去其乘积,保存在一个数组中,下一次循环把它归到被除数中继续做除法运算,最后得到余数并输出。
4.函数功能:
1.voidinit(inta[],intb[],int*p1,int*p2)
2.功能说明:
读入所要计算的数值,数据初始化
3.intplus(inta[],intb[],intc[],intm,intn)
4.功能说明:
两个正整数相加
3.voidchange(inta[],intb[],intm,intn)
功能说明:
当两异号数相加时,改变其符号以符合加法运算
5.intminus(inta[],intb[],intd[],intm,intn)
6.功能说明:
两个正整数相减
5.voidminusfun(inta[],intb[],intd[],intm,intn)
功能说明:
判断两个异号数的相加方式
7.intmulti(inta[],intb[],intc[],intm,intn)
8.功能说明:
两个正整数相乘
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
#include
#include
#defineMAX40//可以修改,此时最大运算位数为四十位
#defineN10//此处应为最大位数除以4
voidinit(inta[],intb[],int*p1,int*p2)//输入
{
inti,j;
charr,s;
for(i=0;i{
a[i]=0;
b[i]=0;
}
printf("请输入处理的第一个数的值:
");
r=getchar();
if(r==45)
{
a[0]=r;
for(i=1;(r=getchar())!
='\n';i++)
a[i]=r-48;
}
else
{
a[1]=r-48;
for(i=2;(r=getchar())!
='\n';i++)
a[i]=r-48;
}
*p1=i;
printf("请输入处理的第二个数的值:
");
s=getchar();
if(s==45)
{
b[0]=s;
for(j=1;(s=getchar())!
='\n';j++)
b[j]=s-48;
}
else
{
b[1]=s-48;
for(j=2;(s=getchar())!
='\n';j++)
b[j]=s-48;
}
*p2=j;
}
intplus(inta[],intb[],intc[],intm,intn)//加法运算
{
intd[MAX]={0},i,j,k;
for(i=0;iif(a[1]==0)
{
for(i=0;ireturn(i);
}
if(b[1]==0)
{
for(i=0;ireturn(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];
if(d[k]>9)
{
d[k+1]++;d[k]=d[k]-10;
}
k++;
i--;
}
while(j>0)
{
d[k]=d[k]+b[j];
if(d[k]>9)
{
d[k+1]++;d[k]=d[k]-10;
}
k++;
j--;
}
d[0]=a[0]+b[0];
c[0]=d[0];
if(d[k]==0)
k--;
for(i=1;k>0;i++,k--)
c[i]=d[k];
return(i);
}
voidchange(inta[],intb[],intm,intn)//变号运算
{
inti,j;
intc[MAX];
if(m<=n&&b[0]==45)
{
for(i=1;ic[i]=a[i];
for(i=1,j=1;ja[i]=b[j];
for(i=1,j=1;jb[i]=c[j];
for(j=i;jb[j]=0;
return;
}
if(m>=n&&a[0]==45)
{
a[0]=0;
b[0]=45;
return;
}
}
intminus(inta[],intb[],intd[],intm,intn)//减法运算
{
intc[MAX]={0},i,j,k;
for(i=0;id[i]=0;
for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++)
{
if(c[k]<0||a[i]
{
c[k]=c[k]+a[i]-b[j];
if(c[k]<0)
{
c[k]+=10;
c[k+1]--;
}
}
elsec[k]=a[i]-b[j];
}
while(i>0)
{
c[k]=c[k]+a[i];
if(c[k]<0)
{
c[k]+=10;
c[k+1]--;
}
k++;i--;
}
c[k]=a[i]+c[k];
while(c[k]<=0&&k>0)
k--;
for(i=1;k>0;i++)
d[i]=c[k--];
return(i);
}
voidminusfun(inta[],intb[],intd[],intm,intn)//判断是否两异号数相加
{
inti,j,f=0,g=0;
if(a[1]==0)
{
if(b[0]!
=0)printf("-");
for(i=1;iprintf("%d",b[i]);
printf("\n");
return;
}
if(b[1]==0)
{
if(a[0]!
=0)
printf("-");
for(i=1;iprintf("%d",a[i]);
printf("\n");
return;
}
if(m==n)
{
for(i=1;i{
if((a[i]b[i]&&a[0]==45))
g=1;
if(a[i]!
=b[i])f=1;
}
if(f==0)
{
printf("0\n");
return;
}
if(g==1)
{
change(a,b,m,n);
printf("-");
j=minus(a,b,d,n,m);
for(i=1;iprintf("\n");return;
}
elseif(a[0]==45&&b[0]==0)
{
j=minus(b,a,d,n,m);
for(i=1;iprintf("%d",d[i]);
printf("\n");
return;
}
else
{
j=minus(a,b,d,m,n);
for(i=1;iprintf("%d",d[i]);
printf("\n");return;
}
}
if(m>n&&b[0]==45)
{
j=minus(a,b,d,m,n);
for(i=1;iprintf("\n");return;
}
if(m{
change(a,b,m,n);
printf("-");
j=minus(a,b,d,n,m);
for(i=1;iprintf("%d",d[i]);
printf("\n");
return;
}
if(m>n&&a[0]==45)
{
change(a,b,m,n);
printf("-");
j=minus(a,b,d,m,n);
for(i=1;iprintf("%d",d[i]);
printf("\n");
return;
}
if(m{
j=minus(b,a,d,n,m);
for(i=1;iprintf("%d",d[i]);
printf("\n");
return;
}
}
intmulti(inta[],intb[],intc[],intm,intn)//正整数乘法运算
{
intd[MAX]={0},e[MAX]={0},i,j,k,r,s,x,y;
for(i=0;ic[i]=0;
if(m<=n)
{
for(i=m-1,s=1;i>0;i--,s++)
{
for(r=0;rfor(j=n-1,k=1*s;j>0;j--,k++)
{
d[k]=a[i]*b[j]+d[k];
if(d[k]>9){d[k+1]=d[k+1]+d[k]/10;d[k]=d[k]%10;}
}
if(d[k]==0)
k--;
y=k;
for(r=1;k>0;r++,k--)
e[r]=d[k];
for(r=1;rd[r]=e[r];
if(s==1)
x=plus(c,d,e,0,y+1);
else
x=plus(c,d,e,y,y+1);
for(r=0;rc[r]=e[r];
}
}
elseif(m>n)
{
for(j=n-1,s=1;j>0;j--,s++)
{
for(r=0;r{
d[r]=0;e[r]=0;
}
for(i=m-1,k=1*s;i>0;i--,k++)
{
d[k]=a[i]*b[j]+d[k];
if(d[k]>9)
{
d[k+1]=d[k+1]+d[k]/10;
d[k]=d[k]%10;
}
}
if(d[k]==0)
k--;
y=k;
for(r=1;k>0;r++,k--)
e[r]=d[k];
for(r=1;rd[r]=e[r];
if(s==1)
x=plus(c,d,e,0,y+1);
else
x=plus(c,d,e,y,y+1);
for(r=0;rc[r]=e[r];
}
}
return(x);
}
voidprint(longc[],intflag)//输出
{
inti;
for(i=N-1;i>=0;i--)
if(c[i])
break;
if(flag)
printf("-");
printf("%4d",c[i--]);
for(;i>=0;i--)
{
if(c[i]/1000)
printf("%4ld",c[i]);
elseif(c[i]/100)
printf("0%3ld",c[i]);
elseif(c[i]/10)
printf("00%2ld",c[i]);
else
printf("000%1ld",c[i]);
}
}
intwrite(longa[],intflag)//将键盘敲入的数字按4位一组放入longa[],且将符号放入flag
{
charnum[N*4];
chartemp;
inti,j,k;
for(i=0;i{
num[i]=getchar();
if(num[i]==10)
{
i--;
break;
}
if(num[i]==45)
{
flag=(flag+1)%2;
i--;
}
}
k=0;
for(j=0;j<=i/2;j++)
{
temp=num[j];
num[j]=num[i-k];
num[i-k]=temp;
k++;
}
k=1;
for(j=0;j<=i;j++)
switch(k)
{
case1:
a[j/4]+=(long)(num[j]-48);
k++;break;
case2:
a[j/4]+=(long)(num[j]-48)*10;
k++;break;
case3:
a[j/4]+=(long)(num[j]-48)*100;
k++;break;
case4:
a[j/4]+=(long)(num[j]-48)*1000;
k=1;break;
}
returnflag;
}
voidmul(longa[],intfirst,intlast,longb[],longc[])//乘法
{
inti,j;
intmax_i;
longtemp;
for(max_i=N-1;max_i>=0;max_i--)
if(b[max_i])
break;
for(i=0;i<=max_i;i++)
if(b[i])
for(j=first;j<=last;j++)
{
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;
inti;
intk=0;
intlen;
for(len=N-1;len>=0;len--)
if(b[len])
break;
if((first-last)>=len)
{
if((first-last)>len)
flag=1;
else
for(i=len;i>=0;i--)
{
if(a[first-k]>b[i])
{
flag=1;
break;
}
if(a[first-k]
{
flag=0;
break;
}
k++;
}
}
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;i<=first;i++)
{
if(a[i]
{
a[i]+=10000;
a[i+1]--;
}
c[i]=a[i]-b[k];
k++;
}
}
else
{
flag=(flag+1)%2;
for(max=N-1;max>=0;max--)
if(b[max])
break;
for(i=0;i<=max;i++)
{
if(b[i]{
b[i]+=10000;
b[i+1]--;
}
c[i]=b[i]-a[last+k];
k++;
}
}
returnflag;
}
voiddiv(longa[],longb[],longc[],intfa)//除法
{
longresult[N+1]={0};
intlen_a;
intk;
inti;
printf("\n");
print(a,fa);
for(len_a=N-1;len_a>=0;len_a--)
if(a[len_a])
break;
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;i>=0;i--)
result[i]=0;
mul(c,k,k,b,result);
}
c[k]--;
for(i=N-1;i>=0;i--)
result[i]=0;
mul(c,k,k,b,result);
minusd(a,len_a,k,result,a,0);
for(i=N-1;i>=0;i--)
result[i]=0;
for(len_a=N-1;len_a>=0;len_a--)
if(a[len_a])
break;
k=len_a;
}
}
voidmenu()//菜单
{
printf("==================================大整数计算器==================================");
printf("1.加法2.减法3.乘法4.除法0.退出\n");
printf("请从1~4中选择:
");
return;
}
voidmain()//主函数
{
intflag;
intmax;
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=&m;
p2=&n;
menu();
s=getchar();
getchar();