1000的阶乘

目前是写论文时期,不是IT专业,本来准备写完论文再开始好好学学算法,学学IT方面知识,为今后的工作添砖加瓦。

慵懒的下午,论文写不进去,咋办,刷刷题目。由于算法太弱了,只能先找点简单题目做做。

PTA的基础部分,6-10。要求实现一个打印非负整数阶乘的函数。

void Print_Factorial ( const int N ); 实现该接口。
N最大可到1000;
用普通的数字肯定是存不了最后的答案的,肯定会出现溢出问题。
因此想到用数组或者链表记录结果的每一位,最后输出每一位就可以了。
最后答案大概有多少位呢? 可以简单估计一下,一位数乘以二位数最大是三位数,二位数乘以二位数最大四位数,本题N最大1000,那么最后答案最大位数为:
1*9+2*9+3*900+3 小于3000
那么用C语言可以定义一个数组 大概3000元素的容量大小即可存放最后答案。c++可以用vector java可以用ArrayList等
实现代码:
void Print_Factorial ( const int N ) {
  if (N < 0) {
    printf("Invalid input\n");
    return;
  }
  if (N <= 1) {
    printf("%d\n", 1);
    return;
  }
  int res[3096] = {1};//记录答案数组
  int res_size = 1;   //开始时答案只有1位
  int carry_bit = 0;   //表示进位数字
  for (int i = 1; i <= N; ++i) {
    for (int j = 0; j < res_size; ++j) {
      int tmp = res[j]*i + carry_bit; //用乘数i,算出本位乘积 假设为34
      res[j] = tmp % 10;              //例如 34 则本位写4 进位3 
      carry_bit = tmp / 10;           //算出 进位 3
    }
    while (carry_bit) {                //最后是否要进位
      res[res_size++] = carry_bit % 10;
      carry_bit /= 10;
    }
  }
  for (int i = res_size-1; i >=0; --i)  //res 数组中存的数字从前到后分别为个、十、百。。。。
    printf("%d", res[i]);
  printf("\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值