// 还记得10进制的乘法么? // 567 // * 5 // ------- // 2835 // 用编程语言表示出来就是 // 当前的int a[4] ={0, 5, 6, 7} // 然后从最低位开始用5去乘以每一位,少于10的部分就是这 // 个位新的值超过10的部分就是进位,加入他的前一位的结果 // 那么从最低位开始a[0]*5=35,由于没有进位所以a[0]=5, carry // =3,a[1]*5=30,加上进位3=33,所以a[1] =3, carry=3,以此类推最 // 高位就是a[3] =2;所以我们的到的数组就是a[4] ={2,8,3,5},结果 // 当然就是2835拉。 #include <stdio.h> #define SIZE 500 // SIZE 500就可以表示结果在500*6=3000位以内的大整数 #define BASE 1000000 // 目前使用进制的基数,1000000进制,6位的底数可以处理1000以内的阶乘 // 超过1000的话会溢出,因为最大的六位数 //乘以4位数可能超过32位整数的范围 // 当处理大一点的阶乘的话就要相应减小这个值 // 所以当你求1千万的阶乘的时候记得base是10,呵呵。 unsigned int a[SIZE]; void jiechen(int n) { int i, j; int carry; //进位 int max =0; //最高位,当前数即表示占了数组的max+1项 a[0] = 1; //最低位初始化成1 for(i=1; i<=n; i++) { carry =0; //每让这个超大的数乘一个新的数字时,进位初始化成0 for(j=0; j<=max; j++) { // 处理每一位,max为最大位数 a[j] = a[j]*i +carry; carry = a[j] / BASE; //超出1000000 作为高位的进位
a[j] = a[j] % BASE; //当前位
} if(carry != 0) //最高位有进位就调整当前最高位 a[++max] = carry; } printf("%d!=", n); //以下是打印过程 printf("%d", a[max]); //最高位我们不打印前面的0,不然看起来不爽XD for(i=max-1; i>=0; i--) //注意:是从高位开始打印的 printf("%06d", a[i]); //打印6位,注意要包括前面的0,还有修改了BASE的话记得改这里!打印6位,不足的补0 printf("\n"); } int main() { for(int i=1; i<100; i++) //打印100以内的阶乘来验证我们的成果 jiechen(i); return 0; }