大整数的四则运算高质量C语言程序资料讲解.docx

上传人:b****1 文档编号:18021821 上传时间:2023-04-24 格式:DOCX 页数:31 大小:1.30MB
下载 相关 举报
大整数的四则运算高质量C语言程序资料讲解.docx_第1页
第1页 / 共31页
大整数的四则运算高质量C语言程序资料讲解.docx_第2页
第2页 / 共31页
大整数的四则运算高质量C语言程序资料讲解.docx_第3页
第3页 / 共31页
大整数的四则运算高质量C语言程序资料讲解.docx_第4页
第4页 / 共31页
大整数的四则运算高质量C语言程序资料讲解.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

大整数的四则运算高质量C语言程序资料讲解.docx

《大整数的四则运算高质量C语言程序资料讲解.docx》由会员分享,可在线阅读,更多相关《大整数的四则运算高质量C语言程序资料讲解.docx(31页珍藏版)》请在冰豆网上搜索。

大整数的四则运算高质量C语言程序资料讲解.docx

大整数的四则运算高质量C语言程序资料讲解

 

大整数的四则运算高质量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;i

if(a[1]==0)

{

for(i=0;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)//变号运算

{

inti,j;

intc[MAX];

if(m<=n&&b[0]==45)

{

for(i=1;i

c[i]=a[i];

for(i=1,j=1;j

a[i]=b[j];

for(i=1,j=1;j

b[i]=c[j];

for(j=i;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

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]

{

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;i

printf("%d",b[i]);

printf("\n");

return;

}

if(b[1]==0)

{

if(a[0]!

=0)

printf("-");

for(i=1;i

printf("%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;i

printf("\n");return;

}

elseif(a[0]==45&&b[0]==0)

{

j=minus(b,a,d,n,m);

for(i=1;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[0]==45)

{

j=minus(a,b,d,m,n);

for(i=1;i

printf("\n");return;

}

if(m

{

change(a,b,m,n);

printf("-");

j=minus(a,b,d,n,m);

for(i=1;i

printf("%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;i

printf("%d",d[i]);

printf("\n");

return;

}

if(m

{

j=minus(b,a,d,n,m);

for(i=1;i

printf("%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;i

c[i]=0;

if(m<=n)

{

for(i=m-1,s=1;i>0;i--,s++)

{

for(r=0;r

for(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;r

d[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;r

c[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;r

d[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;r

c[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[

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1