100阶层算法

//  还记得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 
#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;
}

你可能感兴趣的:(原理)