清华机试-N的阶乘
题目描述
输入一个正整数N,输出N的阶乘。
输入描述:
正整数N(0<=N<=1000)
输出描述:
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
示例1
输入
4 5 15
输出
24 120 1307674368000
解题思路
这道题目主要考察大数乘法。大数乘法的实现思路如下:
1.定义一个向量,用于保存数a,数b各位相乘的结果,向量长度为lena + lenb;
2.从大到小遍历向量,如果值加上进位大于等于10,则将值mod10,然后进位置为值 /10;
3.如果第一个的值加上进位大于等于10,则增加一位。
处理过程中还需要将数字转化为字符串,在C++11中提供了to_string(int)函数,如果要将字符串转化为数字,也有相应的函数。
代码
#include <iostream> #include <string> #include <vector> #include <sstream> using namespace std; void int2str(const int &int_temp,string &string_temp) { stringstream stream; stream<<int_temp; string_temp=stream.str(); } string mul(string a,string b) { string res; int lena,lenb; lena = a.size(); lenb = b.size(); vector<int> tmp(lena + lenb - 1,0); for(int i = 0;i < lena;i++) { for(int j = 0;j < lenb;j++) { tmp[i+j] += (a[i] - '0') * (b[j] - '0'); } } int carry = 0; for(int i = lena + lenb - 2;i >= 0;i--) { int num = carry + tmp[i]; if(num >= 10) { carry = num / 10; tmp[i] = num % 10; } else { tmp[i] = num; carry = 0; } } if(carry > 0) { tmp.insert(tmp.begin(),carry); } for(auto i : tmp) { string temp = to_string(i); res = res + temp; } return res; } int main() { int a; // cout << mul("120","6") << endl; while(cin >> a) { string res = "1"; for(int i = a;i >= 1;i--) { string temp = to_string(i); res = mul(res,temp); } cout << res << endl; } return 0; }