我正在编写一个 C 程序作为家庭作业的一部分,其中我必须获得两个长数字的乘积,这两个数字被视为字符串。例如:123456789021 和 132456789098。由于它被视为字符串,因此我将它们转换为 long long int 进行乘法。但最终的结果将非常大(我猜比 long long int 还要大)。谁能建议我一种执行此乘法的方法?

有帮助吗?

解决方案

这是一种方法:考虑一下如何在纸上手动乘以这些数字。在C中实现这个方法。你将不得不发现:

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

其他提示

表示为字节数组

通常大整数。你可以看一下在DLR微软的BigInteger的实现。我认为他们已经通过克努特开发使用的算法

检查此的BigInteger库和一个非常基本的示例代码七世界

如果您有兴趣在C(仅乘法)我的一些家常代码:

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

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

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

这工作在一些我曾参与早期的编程竞赛;)但是,如果你正在寻找更快乘算法可以实现的 karatsuba算法,我个人现在实时竞赛使用此

嗨,哥们,看看这个,我刚刚完成了它的昨天一天,我的功课的一部分:

#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");
}

您可以使用大整数arithmetik图书馆,维基百科有一个列表这里

另一种方法是乘以数字作为浮动/双和STIP关闭小数显示结果时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top