进击吧!阶乘(解决求大数的阶乘)

本文介绍了解决大整数阶乘计算问题的方法,通过使用数组存储每位数字,有效避免了溢出。作者简化了代码逻辑,详细展示了如何使用C++实现对输入整数N的阶乘计算并输出结果。

千里之行,始于足下

题目描述

给定一个整数N(0≤N≤10000),求取N的阶乘

输入描述:

多个测试数据,每个测试数据输入一个数N

输出描述:

每组用一行输出N的阶乘

示例1

输入

1
2
3

输出

1
2
6

问题分析

        这里我们在解决这个问题的时候很容易忽视一点,就是求阶乘的数越大,最后算出的结果就越长,结果的长度远远超出我们的意料!

        最终你会发现,对于后面数的阶乘,c/c++中所有的类型都无法存储这个数的结果,那怎么办呢?

        我们可以使用数组,数组的每个元素来存储数中的每个位数,而数组的长度可以远远容纳数的位数,知道了这一点,我们对数存储的问题就有了方案了。

解决方法

        原本是更长的代码,如果直接把代码丢过来,我担心大家会头晕😄,为此,我把许多逻辑相近的地方都浓缩了一下,变量也是设置得见名知意,代码格式也根据标准做了调整,现在的核心代码就只有几行了,现在的代码页面看起来更加清晰易懂

#include<bits/stdc++.h>
using namespace std;

int main(){
    int num[100000],jinwei,chengji,k,n;
    //其中k用于记录最高位
    while(~scanf("%d",&n)){
        k=1;
        num[1]=1;
        for(int i=1;i<=n;i++){//枚举因式中的每一个因子 
            jinwei=0;//每次相乘刚开始没有进位,所以要赋值零
            for(int j=1;j<=k;j++){
                chengji=num[j]*i+jinwei;
                jinwei=chengji/10;
                num[j]=chengji%10;
            }
            while(jinwei){//进位处理
                num[++k]=jinwei%10;
                jinwei/=10;
            }
        }
        for(int i=k;i>=1;i--){
            cout<<num[i];
        }
        cout<<endl;
    }
}

补充说明: 

while(~scanf("%d", &n)) 意思就是当有值输入的时候,进入while,当没有值输入时就结束while。

 好了,今天的分享到此结束了

至此希望能够给你带来帮助(#^.^#)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平静方能至远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值