我正在研究C中的一个程序,作为家庭作业的一部分,在这个程序中我必须得到两个长字符作为字符串的乘积。例如:123456789021和132456789098.由于它被视为一个字符串,我将它们转换为long long int来进行乘法运算。但是由此产生的产品将会非常大(我猜大于long long int)。任何人都可以请建议我一种方法来执行这种乘法?乘以两个长整数C
乘以两个长整数C
回答
这里有一种方法:考虑如何在纸上手工乘以这些数字。实施C.这种方法,你必须发现:
- 如何打破了一个整数(表示为字符串)成数字
- 如何每个数字转换回一个整数
0 <= d < 10
- 如何管理的数字阵列(即有多大,你应该做的阵列?)
- 如何编写循环(一个或多个),你可能需要实现乘法
- 如何管理携带来自一个数字产品到下一个
- 如何将这些数字转换为字符以便输出
通常以字节数组表示的大整数。您可以在DLR中查看Microsoft的BigInteger实现。我认为他们已经使用Knuth开发的算法
另一种方法是将数字乘以float/double并在显示结果时指定小数。
这样做可能会损失很多精度。 – 2009-12-06 19:34:07
尽管如此,如果数字太多,那不会给出确切的答案。根据使用情况,这可能是足够好的,但我认为这不是这个任务的重点。 – 2009-12-06 19:41:23
检查这个BigInteger library和一个very basic sample code世界七。
如果你有兴趣在C(仅乘法)我的一些家常代码:
////////////////////////////////////////////////////////////////////////////////
Code removed after I checked the home-work tag ;)
///////////////////////////////////////////////////////////////////////////////////////
这工作在一些我曾参与早期的编程竞赛;)但是,如果你正在寻找甚至更快的乘法算法可以实现Karatsuba algorithm,我现在亲自使用这个实时比赛。
(第一个链接是_Mahbub Murshed Suman_的_BigInteger class_(版本6.7.28,2004年7月30日),第二个来自_World of Seven-Competitive Programming_,即使URL是“steven”。) – greybeard 2016-02-05 14:28:53
嗨,哥们,看看这个,我刚刚完成了它的昨天一天,我的功课的一部分:
#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");
}
- 1. 乘以两个长号
- 2. 批量中乘以两个整数
- 3. 长整数乘法
- 4. 将值显式乘以长整数
- 5. 在C中乘以两个数组
- 6. 增加了两个长整数用C
- 7. 乘以整数
- 8. 乘以两个数据帧
- 9. 整数乘char(C++)
- 10. C:乘两个ScanFs
- 11. 当两个整数相乘时NumberFormatException
- 12. 长乘C
- 13. C#错误除以两个整数
- 14. 乘以二进制给出的两个整数
- 15. 如何在MIPS中乘以两个大于32位的整数?
- 16. 正整数乘法用C
- 17. 为什么两个正整数的乘积是负整数?
- 18. 乘两个大整数存储为整数载体
- 19. 无符号长整数乘法
- 20. jquery错误两位数乘以后的长十进制数
- 21. JavaScript乘以3整数
- 22. 乘以整数使用TMAP
- 23. 在Excel VBA中乘以两个数组
- 24. 使用'lookup'乘以两个python数组
- 25. [R乘以两个数据列帧
- 26. 乘以两个大于255的数字
- 27. x86汇编乘以两个32位数
- 28. 乘以两个字节
- 29. 乘以两个BigDouble值
- 30. 乘以两个多项式
如果它不是一个事实,即你的输入和输出都在基地10,你可以通过使用基数2^32(数字保持在64位类型)或基数2^16(以32位类型)而不是基数10来更有效地完成所有这些操作。 – 2009-12-06 23:10:48