链接:https://www.nowcoder.com/acm/contest/75/E
来源:牛客网
题目描述
给定一个整数N(0≤N≤10000),求取N的阶乘
输入描述:
多个测试数据,每个测试数据输入一个数N
输出描述:
每组用一行输出N的阶乘
示例1
输入
1
2
3
输出
1
2
6
代码:
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n,a[100000];
int i,j,h,p;
while(~scanf("%d",&n)&&n>=0)//
{
a[1]=1;//0和1的阶乘都是1;
p=1;//
for(i=2;i<=n;i++)
{
for(j=1,h=0;j<=p;j++)
{
a[j]=a[j]*i + h;//
h=a[j]/10;//
a[j]%=10;
}
while(h>0)
{
a[j++]=h%10;
h/=10;
}
p=j-1;//
//printf("p=%d,a[p]=%d\n",p,a[p]);
}
for(i=p;i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
return 0;
}
摘:直接看代码比较难理解,可以举个例子,比如说我们现在得到了4!= 24,在数组中是以倒序的方式存储,即42,a[1] = 4,a[2] = 2(数组下标从1开始),现在要计算5!,内层for循环对目前的两位4和2进行处理,即每一位都乘以5,首先a[1] = a[1]*5 + 0(h)= 20,h从0变为2,a[1] = 0;然后a[2] = a[2] * 5 + 2 = 12,h从2变为1,a[2] = 2;这时内层for循环执行结束。
总结1:内层for循环的作用是更新已经存在的位数中的每一位与i的乘积的结果.
接着执行while循环,目前h = 1,a[3] = 1,h 从1变为0,然后退出while循环。处理结束就得到了5! = 120.p的位数增加到3.
总结2:while循环的作用是计算p更新之前的位数之后的进位,比如说p = 2的时候,数组中为42,然后内层for循环把42更新为02,while循环增加进位1,整个数组变为021.
代码:
#include <iostream>
using namespace std;
int main() {
int n, i, j, num, h; //h进位
int a[100005];
while(~scanf("%d", &n)) {
a[1] = 1; //0和1的阶乘等于1,低位在前
num = 1; //位数
for(i = 2; i <= n; ++i) { //i为阶乘需要乘的数从2到n
for(j = 1, h = 0; j <= num; ++j) { //每一位都乘上i
//a[j] *= i + h; //错
a[j] = a[j] * i + h; //对
h = a[j] / 10; //除去最低位
a[j] %= 10; //存放最低位
}
while(h > 0) { //剩余的进位也加上
a[j++] = h % 10;
h /= 10;
}
num = j - 1; //更新位数
}
for(i = num; i >= 1; --i) { //先输出高位,再输出低位
printf("%d", a[i]);
}
printf("\n");
}
return 0;
}