优C语言算法 超大正整数乘法计算_第1页
优C语言算法 超大正整数乘法计算_第2页
优C语言算法 超大正整数乘法计算_第3页
优C语言算法 超大正整数乘法计算_第4页
优C语言算法 超大正整数乘法计算_第5页
已阅读5页,还剩4页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言算法超大正整数乘法计算乘法运算是数学中的一种简单运算,我们在小学的时候常常用竖式乘法的计算方法去计算乘法。对于一些比较大的数字时,通常采用计数器的方法去计算,然而对于一些普通的手机计算器来说,往往只能计算不超过16位数字的乘法。那如何能计算超大正整数的乘法?这是我们需要解决的问题。接下来,我将通过一个简单的例子去展示一种新的整数乘法运算方法。对于326X36这个乘法例子来说,可以通过以下步骤进行计算。第一步,对要相乘的数字进行“取反”,即326变成623,36变成63。第二步,对位数较少的数进行补0使得两个数的位数相同,即63的位数比623的位数少1,所以需要在63后面补1位0,变成630,使得他们位数相同都是3。第三步,对于n位的整数和m位的整数相乘,往往得到的结果的位数为n+m位或n+m-1位,所以326X36的结果为4位数或5位数,然后我们把结果的每一位数字都计算出来,就可以得到结果了。326X36结果的第一位数(即个位)计算方法如下:6X6=36,36除以10的余数为6,整数部分为3,所以326X36的个位为余数6,同时向十位进位,进位数C=3。326X36结果的第二位数(即十位)的计算方法:6X3+2X6+C=30+3=33,33除以10的余数为3,整数部分为3,所以326X36结果的十位为余数3,向百位的进位C=3。326X36结果的第三位数(即百位)的计算方法:6X0+2X3+3X6+C=24+3=27,27除以10的余数为7,整数部分为2,所以326X36结果的百位为余数7,进位C的值为整数部分2,即C=2。326X36结果的第四位数(即千位)的计算方法:2X0+3X3+C=9+2=11,11除以10的余数为1,整数部分为1,所以326X36结果的千位为余数1,进位C=1。326X36结果的第五位数(即万位)的计算方法:3X0+C=0+1=1,1除以10的余数为1,整数部分为0,所以326X36结果的万位为余数1,进位为0。因为326X36结果的最大位数为5位数,所以只需要计算5步就可以得到结果。根据上面的5次计算,可以得到326X36的结果为11736。易验证该结果是正确的。C语言程序:#include<stdio.h>#include<string.h>voidfanz(char*p)//将p中的元素取反,例如,p:1234变为p:4321{inti,length,n;chars;length=strlen(p);//计算p的长度n=length/2;for(i=0;i<n;i++){s=*(p+i);*(p+i)=*(p+length-i-1);*(p+length-i-1)=s;}}voidproduct(char*p,char*q){intshu[1000];//shu[]用来存放大整数p和q相乘结果的每一位数字。例如,p*q=12345,则shu[]={5,4,3,2,1}intn,n1,n2,len,m,sum=0,x,y,cy=0,i,j,M;n1=strlen(p);//计算p的长度n2=strlen(q);//计算q的长度//n=n1+n2;//n值为p和q相乘结果能达到的最大位数,例如,x位的数乘以y位的数得到的结果的位数是x+y-1位或x+y位fanz(p);//将p中的元素取反fanz(q);//将q中的元素取反if(n1>n2)//P的长度大于q的长度时{for(i=n2;i<n1;i++)*(q+i)='0';//在q后面加入字符'0',使得q与p长度相等n=2*n1-1;}elsen=n1+n2;len=strlen(p);for(i=0;i<n;i++){if(i<len){for(j=0;j<=i;j++){x=(int)*(p+i-j)-48;y=(int)*(q+j)-48;sum=sum+x*y;}m=(sum+cy)%10;cy=(sum+cy)/10;sum=0;shu[i]=m;}else{M=i-len;for(j=i-len+1;j<len;j++){x=(int)*(p+len-j+M)-48;y=(int)*(q+j)-48;sum=sum+x*y;}if((i-len+1)==len)shu[i]=cy;m=(sum+cy)%10;cy=(sum+cy)/10;sum=0;shu[i]=m;}}if(shu[n-1]!=0)printf("%d",shu[n-1]);for(i=n-2;i>=0;i--)printf("%d",shu[i]);}intmain(){chars1[500],s2[500];printf("请输入不超过500位的大整数X:");scanf("%s",s1);printf("请输入不超过500位的大整数Y:");scanf("

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论