乘法运算是数学中的一种简单运算,我们在小学的时候常常用竖式乘法的计算方法去计算乘法。对于一些比较大的数字时,通常采用计数器的方法去计算,然而对于一些普通的手机计算器来说,往往只能计算不超过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>
void fanz(char *p) //将p中的素取反,例如,p:1234变为p:4321
{
int i,length,n;
char s;
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;
}
}
void product(char *p,char *q)
{
int shu[1000];
//shu[]用来存放大整数p和q相乘结果的每一位数字。例如,p*q=12345,则shu[]={5,4,3,2,1}
int n,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;
}
else n=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]);
}
int main()
{
char s1[500],s2[500];
printf(“请输入不超过500位的大整数X:”);
scanf(“%s”,s1);
printf(“请输入不超过500位的大整数Y:”);
scanf(“%s”,s2);
printf(“X*Y=”);
if(strlen(s1)<strlen(s2))
product(s2,s1);
else product(s1,s2);
printf(“\n”);
return 0;
}
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/16421.html