大整数的四则运算 高质量C语言程序.docx
《大整数的四则运算 高质量C语言程序.docx》由会员分享,可在线阅读,更多相关《大整数的四则运算 高质量C语言程序.docx(28页珍藏版)》请在冰豆网上搜索。
![大整数的四则运算 高质量C语言程序.docx](https://file1.bdocx.com/fileroot1/2022-10/22/d486dffb-4ace-4d7b-b4c4-e09a9a6dee66/d486dffb-4ace-4d7b-b4c4-e09a9a6dee661.gif)
大整数的四则运算高质量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.void init(int a[],int b[],int*p1,int*p2)ﻩ
2.功能说明:
读入所要计算的数值,数据初始化
3.int plus(inta[],int b[],intc[],intm,intn)
4.功能说明:
两个正整数相加
3. void change(inta[],int b[],intm,int n)
功能说明:
当两异号数相加时,改变其符号以符合加法运算
5.int minus(int a[],int b[],int d[],intm,intn)
6.功能说明:
两个正整数相减
5.voidminusfun(inta[],intb[],intd[],intm,intn)ﻩ
功能说明:
判断两个异号数的相加方式
7.intmulti(inta[],intb[],int c[],int m,intn)
8.功能说明:
两个正整数相乘
7.void print(longc[],int flag)
功能说明:
打印带符号flag(1为负)的long c[]数组
8。
intwrite(longa[],intflag)
功能说明:
将键盘敲入的数字按4位一组放入longa[],且将符号放入flag
9.voidmul(longa[],intfirst,intlast,longb[],longc[])
功能说明:
乘法,a的第last到first位乘以b,答案放到c
10.intcompara(longa[],intfirst,int last,longb[])
功能说明:
比较数组a,b大小,firstlast分别为a的最高最低位
11。
intminusd(long a[],intfirst,intlast,longb[],longc[],int flag)
功能说明:
a为被减数,first last为a最高最低位,b为减数,c为差,flag为符号
12.voiddiv(longa[],longb[],longc[],intfa)
功能说明:
除法,a除以b的值放入c,fa为a符号
13。
voidmenu()
功能说明:
打印菜单函数
14. void main()
功能说明:
主函数,调用其余函数,计算相应功能的值并输出。
5。
源程序:
#include〈iostream。
h>
#include<math.h>
#include〈stdio.h>
#defineMAX40 //可以修改,此时最大运算位数为四十位
#define N10 //此处应为最大位数除以4
voidinit(int a[],int b[],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';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[],int m,int n) //加法运算
{
intd[MAX]={0},i,j,k;
ﻩfor(i=0;i<MAX;i++) c[i]=0;
if(a[1]==0)
ﻩ{
ﻩfor(i=0;i<n;i++) c[i]=b[i];
ﻩreturn(i);
ﻩ}
ﻩif(b[1]==0)
{
ﻩﻩfor(i=0;iﻩﻩreturn(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) //变号运算
{
int i,j;
ﻩintc[MAX];
ﻩif(m<=n&&b[0]==45)
ﻩ{
ﻩfor(i=1;i〈m;i++)
ﻩﻩc[i]=a[i];
for(i=1,j=1;j<n;i++,j++)
ﻩﻩa[i]=b[j];
ﻩfor(i=1,j=1;j<n;i++,j++)
ﻩb[i]=c[j];
ﻩfor(j=i;j<MAX;j++)
ﻩﻩb[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;i〈MAX;i++)
ﻩd[i]=0;
ﻩfor(i=m-1,j=n—1,k=1;i〉0&&j〉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];
}
ﻩ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[],int b[],int d[],intm,int n) //判断是否两异号数相加
{
ﻩinti,j,f=0,g=0;
if(a[1]==0)
ﻩ{
ﻩif(b[0]!
=0)printf("-");
ﻩfor(i=1;iﻩﻩprintf(”%d”,b[i]);
ﻩﻩprintf("\n");
return;
}
ﻩif(b[1]==0)
{
ﻩif(a[0]!
=0)
ﻩﻩprintf("-”);
for(i=1;i<m;i++)
ﻩprintf("%d",a[i]);
printf(”\n");
ﻩreturn;
}
ﻩif(m==n)
ﻩ{
ﻩfor(i=1;i<m;i++)
ﻩ{
ﻩﻩif((a[i]〈b[i]&&b[0]==45)||(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;iﻩprintf(”\n");return;
}
elseif(a[0]==45&&b[0]==0)
{
ﻩj=minus(b,a,d,n,m);
for(i=1;i<j;i++)
ﻩﻩprintf("%d",d[i]);
ﻩprintf("\n”);
ﻩreturn;
ﻩ}
else
{
ﻩj=minus(a,b,d,m,n);
ﻩﻩfor(i=1;iﻩﻩprintf(”%d”,d[i]);
printf("\n”);return;
}
}
if(m>n&&b[