清华考研复试上机——N的阶乘
2018-01-17 15:24
671 查看
输入一个正整数N,输出N的阶乘。
示例1
思路: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";
}
}
输入描述:
正整数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";
}
}
相关文章推荐
- 清华考研复试上机——最大序列和
- 清华06cs考研复试上机题(含解答)
- 清华考研复试上机——10进制 VS 2进制
- 清华考研复试上机——代理服务器
- 清华考研复试上机——进制转换
- 清华考研复试上机——玛雅人的密码
- 北大考研复试上机——放苹果
- 北大考研复试上机——Repeater
- 浙江大学2005年计算机考研上机复试
- 后缀子串排序(后缀数组) - 上海交通大学计算机历年考研复试上机题
- 2012北邮计算机考研复试上机题解
- 2016北邮计算机考研复试上机题解
- 约数的个数——清华大学考研复试上机题
- 2014北邮计算机考研复试上机题解(上午+下午)
- 考研复试-----C语言上机操作(一)
- 【优先队列orVector】清华大学考研复试上机——成绩排序
- 北京航空航天大学计算机系考研复试上机真题及答案---2014
- 华中科技大学_2010___考研计算机_复试上机
- 二叉查找树(华中科技大学计算机考研复试上机题)
- 2014北邮计算机考研复试上机题解(上午+下午)