您的位置:首页 > 其它

清华考研复试上机——N的阶乘

2018-01-17 15:24 671 查看
 输入一个正整数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
.length();
for(int i=len-1; i >= 0; i--)
{
cout << str
[i];
}
cout << "\n";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: