C++小案例-利用数组计算n(防止溢出)

输入一个整数n,输出n!
//计算n!

//计算n!
#include<stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    int num[300] = {1}, len = 0, rem = 0, i, j;
    for(i = 2; i<=n; i++)//将每次的阶乘结果在数组中倒序存储,每次与i相乘之后与10求余个位留下,十位进到数组的下一位
    {
        for(j = 0; j <= len; j++)
        {
            rem += num[j] * i;
            num[j] = rem % 10;
            rem /= 10;
            if(j == len && rem != 0) len++;//如果数组已满且rem中不为零则需要将数字长度加一
        }
    }
    for(i = len; i >= 0; i--)//将数组倒序输出
        printf("%d", num[i]);
    return 0;
}

算法思想:
举个例子,比如说我们现在得到了4!= 24,在数组中是以倒序的方式存储,即42,a[0] = 4,a[1] = 2(数组下标从1开始),现在要计算5!
第一次循环:i=5,j=0,len=1,rem=0
rem=num[0]i+rem=45=20;
num[0]=rem%10=0;
rem=rem/10=2;
第二次循环:i=5,j=1,len=1,rem=2
rem=num[1]i+rem=25+2=12;
num[1]=rem%10=2;
rem=rem/10=1;
j==len=1且rem不为0
则len++
第三次循环:i=5;j=2;len=2,rem=1;
rem=num[2]i+rem=05+1=1;
num[2]=rem%10=1;
rem=rem/10=0;

所以倒序输出可得:120

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值