1172:求10000以内n的阶乘

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 2947 通过数: 899

【题目描述】

求10000以内n的阶乘。

【输入】

只有一行输入,整数n(0≤n≤10000)。

【输出】

一行,即n!的值。

【输入样例】

4

【输出样例】

24

【来源】

No

【代码】

#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int main()
{
    int a[40000];
    int n,t=1,m=1,b;  //m用于进位的数组下标,b表示进位之后的数
    a[0]=1;
    cin>>n;
    if(n==0)
    {
        cout<<1;
        return 0;
    }
    for(int j=2;j<=n;j++)    // j代表n的数值进行阶乘
    {
    b=0;
        for(int k=0;k<m;k++)   //进行乘法运算
        {
            t=a[k]*j+b;
            b=t/10;                //除法将个位提出去
            a[k]=t%10;           //取模将个位提出来,赋值为数组a[]
        }
        while(b>0)           //进行进位,并将m的值进行了加1
        {
            a[m++]+=b%10;
        b/=10;
        }
    }
    while(m>0)   //因为乘法运算是从左至右,且前面a[0]存放的个位,所以要倒序输出。
    {
        cout<<a[--m];
    }
    return 0;
}

【解题思路】

难点:阶乘之后的进位

1.设a[0]为个位数开始进行乘法运算,初始值设为1;此时要分为两种情况,一种是当n等于0,一种是当n不等于0时。

2.输入n值之后用for循环进行阶乘运算,运算完之后,如果发现b(进位数)大于0之后(代表着乘完之后的数值是大于10的),就要进行进位了,也就是让m进行自加运算,要注意乘到后期b的值有可能是百位数,千位数,因此要用while循环进行进位。

while(b>0)           //进行进位,并将m的值进行了加1
        {
            a[m++]+=b%10;
        b/=10;
        }

3.最后输出时要注意倒序输出。

while(m>0)   //因为乘法运算是从左至右,且前面a[0]存放的个位,所以要倒序输出。
    {
        cout<<a[--m];
    }

猜你喜欢

转载自blog.csdn.net/ice___snow/article/details/81631094