本文最后更新于 522 天前,其中的信息可能已经有所发展或是发生改变。
两个很大的数字做乘法,必然得写高精,不然炸。
两个数做乘法,可以这样来考虑,A*B,相当于从B的最小位开取,分别乘以A的每一位,然后向左平移一定长度,然后加到对应位,最后再来考虑进位。
上代码
void hm(char*a,char*b,char*ans)
{
int arr1[2002]={0};
int arr2[2002]={0};
int arr3[4004]={0};
int i,t,s=0,c,sum;
int len1,len2,len;
len1=strlen(a); //判断第一个数字的长度
len2=strlen(b); //判断第二个数字的长度
len=len1+len2; //判断相乘之后的最大可能长度
for(i=len1-1;i>=0;i--) //把第一个数字转换为数组
arr1[len1-i-1]=*(a+i)-'0';
for(i=len2-1;i>=0;i--) //第二个数字转为数组
arr2[len2-i-1]=*(b+i)-'0';
for(i=0;i<len2;i++) //逐位取第二个数字
{
for(t=0;t<len1;t++)
{
arr3[i+t]+=arr2[i]*arr1[t]; //计算
}
}
for(i=0;i<len;i++)
{ //进位
arr3[i]+=s;
s=arr3[i]/10;
arr3[i]=arr3[i]%10;
}
len=1;
for(i=4003;i>=0;i--)
{ //判断结果的位数
if(arr3[i]!=0)
{
len=i+1;
break;
}
}
*(ans+len)='\0';
for(i=len-1;i>=0;i--) //将结果存储为字符串
{
*(ans+len-i-1)=arr3[i]+'0';
}
}
菜鸡呜呜
牛逼👍