对结果进行切分,切分的宽度可以是 4、5 ,6,7,8.。
把结果存入 a[100000]; 这个数组中 ,假设每个元素存的是结果的5位,那么这个数组就能存 500000 位的数,绝对足够大。
比如 10 != 3628800.。
那么在数组 a [] 的储存情况是 a [ 0 ] = 28800,,a [ 1 ] = 36..
再比如 一个数是 1 0 9 8 7 6 5 4 3 2 1 .。它的储存情况是。。a [ 0 ] = 54321 ,a [ 1 ] = 09876 , a[ 2 ] = 1....
运算的时候就像大数相乘,每个元素都要乘,如果这个元素超过了 5 位,就进位,加到下一个元素上,
以此类推。。
最后从后往前输出数组。
要注意的是,如果 分割的宽度是 5 ,除了数组最后的元素不确定是不是 5 位, 其它的输出都要 “%05d”。。!!
#include <cstdio> #include <algorithm> #include <iostream> using namespace std; int a[100000]={1,0}; int n,i,c,len,j; int main() { scanf("%d",&n); len = 1; // len 是用来记录 a 中有几个元素。 for (i = 2;i <= n; ++ i) { c = 0; // c 是 进位的 数 for (j = 0;j < len;++ j) { a[j] = (a[j] * i + c ); // 注意每次乘都要 +c(加上 上次进位的数) c = a[j]/100000; //如果运算结果小于 5 位,c 是为 0的。 a[j] %= 100000; // 保证每个元素存5 位数 } if(c > 0) // 经过个循环,如果 c > 0 了,就说明超过了5位,要进位 { a[j] = c; // a 新增个元素存进位的数 ++len; // 那么就需要 len ++,记录元素的个数。。 } } printf("%d",a[--len]); // 先输入最高的几位,不确定有多少,也不用管。 while(len) printf("%05d", a[--len]); // 后面的都是 5 位,注意格式。 printf("\n"); return 0; }