输入一个正整数N,输出N的阶乘。
输入描述:
正整数N(0<=N<=1000)
输出描述:
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
示例1
输入
4 5 15
输出
24 120 1307674368000思路:1000的阶乘肯定是超过long long不知道多少位的。所以这道题只能用字符串来处理。好在这道题要实现的乘法是一个大整数乘以一个小数字(1000以内),比一个完整的大整数乘法简单许多。
过程:用1001个字符串储存0~1000的阶乘,初始化0和1的阶乘为"1",遍历一遍字符串,计算出2~1000的阶乘。这个乘法比较简单,测试时只需要查表即可。
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <memory>
#include <cstring>
#include <cmath>
#include <map>
#include <iostream>
using namespace std;
// str is reversed
string str[1005];
// sum = str * factor
void mul(string &sum, const string &str, int factor)
{
sum.assign("");
int len = str.length();
int carrior = 0;
for(int i=0; i < len; i++)
{
int tmp = (str[i] - '0') * factor + carrior;
char t = tmp % 10 + '0';
sum.append(1, t);
carrior = tmp / 10;
}
while(carrior != 0)
{
char tmp = carrior % 10 + '0';
carrior /= 10;
sum.append(1, tmp);
}
}
int main()
{
str[0].assign("1");
str[1].assign("1");
for(int i = 2; i <= 1000; i++)
{
mul(str[i], str[i-1], i);
}
int n;
while(cin>>n)
{
int len = str[n].length();
for(int i=len-1; i >= 0; i--)
{
cout << str[n][i];
}
cout << "\n";
}
}