Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1 2 3
Sample Output
1 26
一开始用自己写的大数乘法模板,调用起来都费事,一开始想的事,写出一个大数乘法的模板,这样在计算大数乘法的时候就可以直接调用了,没想到自己再碰到实际问题的时候,函数调用起来这么麻烦,各种问题,写点自己的心得吧,模板虽然好用,但是关键要看你的模板的通用性,具体问题要具体分析,不要有模板可用就直接套模板,看看是否用其他方法实现起来是否更加快捷,不要被模板禁锢了自己的思维,弄了一下午的乘法模板,结果用起来还这么费事,数据还过不了,所以一定要学会变通,做题动脑子,不要上来就写,就套模板
下面是借鉴了网上大牛的代码,很精简
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<cmath> #include<iomanip> #define maxn 10000 #define MAX 10000 using namespace std; //这个题都用不到字符串来进行输入,所以都直接用的int类型,具体问题具体分析,如果需要输入字符串,在进行另外处理 void f(int n) { int a[maxn], i, j; int place, carry; //位数和进位 a[0] = 1; place = 0; //默认阶乘的结果一开始为1,位数只有1为,下标从零开始 //计算阶乘 ,数组的第一个元素是该数字的最小位 for(i=1; i<=n; ++i) { carry = 0; //每次换一个数进行相乘,进位都要清零 for(j=0; j<=place; ++j) { a[j] = a[j] * i + carry; carry = a[j] / 10000; a[j] %= 10000; } if(carry > 0) { ++place; a[place] = carry; } } //输出结果,除了最高位以外,其余位上,不够四位,补0 cout<<a[place]; for(i=place-1; i>=0 ; --i) cout<<setw(4)<<setfill('0')<<a[i]; cout<<endl; return; } int main() { int n; while(cin>>n) { f(n); } return 0; }