100阶层算法

来源:互联网 发布:淘宝收藏店铺 编辑:程序博客网 时间:2024/04/29 07:02
//  还记得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;}
0 0
原创粉丝点击