时间限制: 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];
}