大数算法

#include<stdio.h>
#include<math.h>
#define RADIX   10
#define WIDTH   ((int)(log(RADIX)/log(10)))
int main()
{
    unsigned long long a[8000], an, n, i, f;
    for(; scanf("%d", &n) != EOF; puts(""))     //输入直到文件末尾,puts输出换行
    {
        for(i = 0; i < 8000; a[i++] = 0);       //清0

        for(a[0] = an = 1; n; n--)
        //f ? (a[an++] = f) : 0表示:f代表进位,如果有进位,那么就添加新的。比如2*8=16,如果用一个字节存只能是个位的6,这里需要用新的来存十位1.
        {
            for(f = i = 0; i < an; i++) 
            {
                a[i] = a[i] * n + f;
                f = a[i] / RADIX;
                a[i] %= RADIX;
            }
            while(f)
            {
                a[an++]=f%RADIX;
                f = f/RADIX;
            }
        }
        for(printf("%lld", a[--an]); an--; printf("%0*lld",WIDTH, a[an]));
    }
    return 0;
}

阶乘算法

思路

  • 把数进行进制化

    常规的是10进制存储,这里通过RADIX表示进制,然后计算出来按照对应的进制输出。

  • 涉及到大小端,这里使用的类大端序。