版权声明:本文为博主原创,未经博主允许不得转载。转载请附上原文链接。 https://blog.csdn.net/qq_38341682/article/details/88604184
题目描述
输入一个正整数N,输出N的阶乘。
输入描述
正整数N(0<=N<=1000)
输出描述
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
分析
大数运算,肯定爆long long int,不能暴力求解。5000的阶乘位数是16326位,所以开个20000位的数组肯定能够存下结果。一般这种大数运算都是模拟手工运算的过程,这道题比较好的是N是一个int以内的数。所以只需要模拟一个大数与一个int数相乘即可,比需要模拟两个大数相乘要简单许多。因此在模拟乘法时,以int数作为被乘数,这样不用模拟两个数都一位一位的乘,只需要将用来存结果的数按位相乘即可。
在具体实现时可以使用一个下标来记录当前位数,计算过程中要注意最高位的进位,输出结果时也要从最高位开始输出。
AC代码如下:
#include<iostream>
using namespace std;
int main(void)
{
int n;
while(cin >> n)
{
int result[20001] = {0};//结果
result[0] = 1;//初始化
int index = 1;//记录最高位的后一位下标
for(int i = 2; i <= n; ++i)//阶乘
{
int temp = 0;//用于进位
//按位相乘,可以将这当作一个模板,很多大数运算都可以按照这种思路来做
for(int j = 0; j < index; ++j)
{
temp += result[j] * i;
result[j] = temp % 10;
temp /= 10;
}
while(temp)//判断最高位有没有进位
{
result[index++] = temp % 10;
temp /= 10;
}
}
for(int i = index-1; i >= 0; --i)//输出结果
{
cout << result[i];
}
cout << endl;
}
return 0;
}