乘以两个长多头的C

时间:2009-12-06 19:09:34

标签: c int long-integer multiplication

我正在研究C中的一个程序,作为家庭作业的一部分,我必须得到两个长数字的产品,这些数字被视为字符串。例如:123456789021和132456789098.由于它被视为一个字符串,我将它们转换为long long int进行乘法运算。但是最终的产品会非常大(我估计比长长的int大)。任何人都可以建议我一种方法来执行这种乘法吗?

6 个答案:

答案 0 :(得分:15)

以下是一种方法:考虑如何在纸上手动将这些数字相乘。在C中实现此方法。您必须发现:

  • 如何将整数(表示为字符串)分解为数字
  • 如何将每个数字转换回整数0 <= d < 10
  • 如何管理数字数组(例如,你应该制作多大的数组?)
  • 如何编写可能需要实现乘法的循环
  • 如何管理从一位数到下一位数的产品
  • 如何将这些数字转换回字符以便输出

答案 1 :(得分:1)

通常表示为字节数组的大整数。您可以在DLR中查看Microsoft的BigInteger实现。我认为他们使用了Knuth开发的算法

答案 2 :(得分:1)

从World of Seven查看此BigInteger libraryvery basic sample code

如果您对我在C中的一些自制代码感兴趣(仅限乘法):

////////////////////////////////////////////////////////////////////////////////

Code removed after I checked the home-work tag ;)

///////////////////////////////////////////////////////////////////////////////////////

这适用于我参与的一些早期编程竞赛;)但如果您正在寻找更快的乘法算法,您可以实施Karatsuba algorithm,我个人现在在实时竞赛中使用它。

答案 3 :(得分: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");
}

答案 4 :(得分:0)

您可以将库用于大型整数算术,维基百科有一个列表here

答案 5 :(得分:0)

另一种方法是将数字乘以浮点数/双数,并在显示结果时将十进制数除掉。