作为作业的一部分,我正在使用 C 语言编写一个程序,在该程序中,我必须得到两个长数字的乘积,它们被视为字符串。例如:123456789021 和 132456789098。由于它被视为一个字符串,我将它们转换为 long long int 以进行乘法运算。但是生成的产品会非常大(我猜比 long long int 大)。谁能建议我一种执行这种乘法的方法?
问问题
7240 次
6 回答
15
这是一种方法:考虑如何在纸上手工将这些数字相乘。在 C 中实现此方法。您将不得不发现:
- 如何将整数(表示为字符串)分解为数字
- 如何将每个数字转换回整数
0 <= d < 10
- 如何管理数字数组(即,您应该制作多大的数组?)
- 如何编写可能需要实现乘法的循环
- 如何管理将产品从一位数转移到下一位数
- 如何将这些数字转换回字符以进行输出
于 2009-12-06T19:13:26.493 回答
1
通常表示为字节数组的大整数。您可以查看 Microsoft 在 DLR 中的 BigInteger 实现。我认为他们使用了 Knuth 开发的算法
于 2009-12-06T19:20:43.220 回答
1
检查这个 BigInteger 库和来自 World of Seven的一个非常基本的示例代码。
如果您对我在 C 中的一些自制代码感兴趣(仅乘法):
////////////////////////////////////////////////////////////////////////////////
Code removed after I checked the home-work tag ;)
///////////////////////////////////////////////////////////////////////////////////////
这在我参加的一些较早的编程竞赛中有效;)但是如果您正在寻找更快的乘法算法,您可以实现Karatsuba 算法,我个人现在在实时竞赛中使用它。
于 2009-12-07T04:12:22.357 回答
1
嘿伙计,看看这个,我昨天刚刚完成了它作为我家庭作业的一部分:
#include<stdio.h>
#include<string.h>
int main()
{
char one[195];
char two[195];
char temp[195];
int a[195],c[195],b[195];
int x,i,j,k,l,p,add;
for(;;)/*determining the larger number...*/
{
printf("Input A:");
gets(one);
printf("Input B:");
gets(two);
k=strlen(one);
l=strlen(two);
if(l>k)
{
strcpy(temp,one);
strcpy(one,two);
strcpy(two,temp);
break;
}
else
{
break;
}
}
k=strlen(one);
l=strlen(two);
for(p=0;p<195;p++)/*assigning all initial values to 0*/
{
a[p]=0;
b[p]=0;
c[p]=0;
}
for(i=0;one[i];i++)/*converting char to integer(note:1,as a character assigned as 49.)*/
{
a[i]=((one[--k])-48);
}
for(i=0;i<two[i];i++)
{
b[i]=((two[--l])-48);
}
for(i=0;i<=strlen(two);i++)/*main algorithm*/
{
add=0;
p=0;
for(j=i;j<=(2*strlen(one)-1);j++)
{
x=c[j]+b[i]*a[p]+add;
c[j]=x%10;
add=x/10;
p++;
}
}
printf("\nMultiplication:");
for(p=(2*strlen(one)-1);p>=0;p--)
{
if(p>strlen(one)&&c[p]==0)
{
continue;
}
printf("%d",c[p]);
}
printf("\n");
}
于 2011-04-18T19:32:29.113 回答
0
您可以使用大整数算法库,维基百科在此处有一个列表。
于 2009-12-06T19:19:48.650 回答
0
另一种方法是将数字乘以浮点数/双精度数,并在显示结果时去掉小数点。
于 2009-12-06T19:28:35.050 回答