大整数の乗算


コンピュータ記憶データはタイプ別に空間を割り当てるもので、一般的には2バイトの範囲が-32768~32767の間に整形され、長整形は4バイト32ビットであり、その範囲は-21748483648~21748483647である.次に、配列を使用して、高精度データ(長整形の範囲を超える値)を計算します.
例:高精度データ*長整数
アルゴリズムは次のとおりです.
#include <iostream>
#include<string.h>
using namespace std;

int main()
{
    long b,c,d;
    int a[256],n;
    char str[256];
    printf("Input a great number:");
    scanf("%s",str);
    printf("input a long integer number:");
    scanf("%ld",&c);
    d=0;
    n=strlen(str);
    //    n    
    for(int i=0,j=n-1;i<n;i++,j--)
    {
        b=(str[j]-48)*c+d;
        a[i]=b%10;
        d=b/10;
    }
    //        
    while(d)
    {
        a[n]=d%10;
        d=d/10;
        n++;
    }

    for(int i=n-1;i>=0;i--)
        printf("%d",a[i]);

    return 0;
}

プログラミングはn<=100の時を求めて、n!を行ないます.
#include <iostream>

using namespace std;

int main()
{
    long a[256], b, c, d;
    int m = 1, i, j,n,r;
    scanf("%d", &n);
    d = 0;
    a[1] = 1;

    for(i = 2; i <= n; i++)
    {
        for(j = 1; j <= m; j++)
        {
            c = a[j] * i + d;
            a[j] = c % 1000000;
            d = c / 1000000;
        }
        if(d)
        {
            a[j]=d;
            ++m;
        }
    }
    printf("%d!=",n);
    for(i=m;i>=1;i--)
    {
        if(a[i]==0)
            continue;
        else
        {
            r=i;
            break;
        }
    }
        printf("%ld",a[r]);
        for(i=r-1;i>=1;i--)
        {
            if(a[i]>99999)
                printf("%ld",a[i]);
            else if(a[i]>9999)
                printf("0%ld",a[i]);
            else if(a[i]>999)
                printf("00%ld",a[i]);
            else if(a[i]>99)
                printf("000%ld",a[i]);
            else if(a[i]>9)
                printf("00000%ld",a[i]);
            else
                printf("00000ld",a[i]);
        }
    return 0;
}

スペースを節約するために、長い整形配列を採用し、配列要素ごとに6ビット保存します.