大数算法
#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表示进制,然后计算出来按照对应的进制输出。
涉及到大小端,这里使用的类大端序。