5

私は宿題の一部としてCのプログラムに取り組んでいます。このプログラムでは、文字列として使用される2つの長い数字の積を取得する必要があります。例:123456789021および132456789098。文字列として取得されるため、乗算のためにlonglongintに変換しました。しかし、結果として得られる製品は非常に大きくなります(long long intよりも大きくなると思います)。誰かが私にこの乗算を実行する方法を提案できますか?

4

6 に答える 6

15

ここに 1 つのアプローチがあります。紙の上で、これらの数値を手で掛ける方法を考えてみてください。このメソッドを C で実装します。以下を発見する必要があります。

  • 整数 (文字列として表される) を数字に分割する方法
  • 各桁を整数に戻す方法0 <= d < 10
  • 数字の配列を管理する方法 (つまり、配列をどのくらいの大きさにする必要がありますか?)
  • 乗算の実装に必要なループの書き方
  • 運ぶ製品を桁から桁へと管理する方法
  • これらの数字を出力用の文字に変換する方法
于 2009-12-06T19:13:26.493 に答える
1

通常、バイト配列として表される大きな整数。DLRでのMicrosoftのBigInteger実装を見ることができます。彼らはKnuthによって開発されたアルゴリズムを使用したと思います

于 2009-12-06T19:20:43.220 に答える
1

この BigInteger ライブラリと、World of Sevenの非常に基本的なサンプル コードを確認してください。

C で作成した私の家庭用コード (乗算のみ) に興味がある場合は、次のようにします。

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

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

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

これは、私が参加した以前のプログラミング コンテストのいくつかで動作します ;)しかし、さらに高速な乗算アルゴリズムを探している場合は、カラツバ アルゴリズムを実装できます。私は現在、これをリアルタイム コンテストで個人的に使用しています。

于 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

別のアプローチは、数値を float/double として乗算し、結果を表示するときに小数点を削除することです。

于 2009-12-06T19:28:35.050 に答える