Project Euler 20 Factorial digit sum(大數乘法)

超級傳送門:http://projecteuler.net/problem=20


用了自己寫的大數乘法模板,乘法模板利用了這兒介紹的加法模板,注意設定內部tmp和ans數組的大小。


#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;

void add(char* des, char* src)
{
    char tmp[10100];

    int lenDes = strlen(des);
    int lenSrc = strlen(src);

    int i, j;
    int c = 0;
    int tIndex = 0;
    for (i = lenDes - 1, j = lenSrc - 1; i >= 0 && j >= 0; i--, j--)
    {
        tmp[tIndex++] = des[i] + src[j] + c - '0';

        if (des[i] + src[j] + c - '0' > '9')
        {
            c = 1;
            tmp[tIndex - 1] -= 10;
        }
        else
            c = 0;
    }

    while (i >= 0)
    {
        tmp[tIndex++] = des[i] + c;

        if (des[i] + c > '9')
        {
            c = 1;
            tmp[tIndex - 1] -= 10;
        }
        else
            c = 0;

        i--;
    }

    while (j >= 0)
    {
        tmp[tIndex++] = src[j] + c;

        if (src[j] + c > '9')
        {
            c = 1;
            tmp[tIndex - 1] -= 10;
        }
        else
            c = 0;

        j--;
    }

    if (c != 0)
    {
        tmp[tIndex++] = c + '0';
        c = 0;
    }

    tmp[tIndex] = '\0';

    for (int i = 0; i < (tIndex >> 1); i++)
    {
        char t = tmp[i];
        tmp[i] = tmp[tIndex - i - 1];
        tmp[tIndex - i - 1] = t;
    }

    tmp[tIndex] = '\0';

    strcpy(des, tmp);
}

void mul(char* des, char* src)
{
    char ans[10100];
    char tmp[10100];

    memset(ans, 0, sizeof(ans));
    int lenDes = strlen(des);
    int lenSrc = strlen(src);

    int i, j;
    int c = 0;
    int tIndex = 0;
    for (j = lenSrc - 1; j >= 0; j--)
    {
        tIndex = 0;
        for (i = lenDes - 1; i >= 0; i--)
        {
            tmp[tIndex++] = (des[i] - '0') * (src[j] - '0') + c;

            if (tmp[tIndex - 1] > 9)
            {
                c = tmp[tIndex - 1] / 10;
                tmp[tIndex - 1] %= 10;

            }
            else
                c = 0;

            tmp[tIndex - 1] += '0';
        }

        if (c > 0)
        {
            tmp[tIndex++] = c + '0';
            c = 0;
        }

        for (int k = 0; k < (tIndex >> 1); k++)
        {
            char t = tmp[k];
            tmp[k] = tmp[tIndex - k - 1];
            tmp[tIndex - k - 1] = t;
        }

        for (int k = 0; k <= lenSrc - 1 - j; k++)
            tmp[k + tIndex] = '0';

        tIndex += lenSrc - 1 - j;
        tmp[tIndex] = '\0';

        add(ans, tmp);
    }
    strcpy(des, ans);
}

int main()
{
    char a[10100] = "1";
    char b[10100];

    for (int i = 2; i <= 100; i++)
    {
        sprintf(b, "%d", i);
        mul(a, b);
    }

    int ans = 0;
    int len = strlen(a);

    for (int i = 0; i < len; i++)
        ans += a[i] - '0';

    printf("%d\n", ans);

    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章