N!水题
//题目是求N!的问题,思路:设定一个整形数组来存放每次计算过后的值
有两个for循环,第一个for循环每次加进一个数
然后在第二个for循环里面计算出此时的阶乘,比如9999,先给出i=2
在第二个for循环里面计算出2的阶乘,保存在数组里,然后i=3,在计算3的阶乘,后面以此类推。。。
#include<stdio.h> #include <iostream> #include<string.h> #include<stdlib.h> #define N 8000 //只需这么多就足够了!!! using namespace std; int s[N]; int main() { int i,j,k,t,n; while(scanf("%d",&n)!=EOF) { memset(s,0,sizeof(s)); //每次使用前要清零 s[0]=1; for(i=2;i<=n;++i) //计算n! { for(t=0,j=0;j<N;++j)//N也不算大,不用再改进了,要改进的话就是去计算n!的位数,计算方法如上 { k=s[j]*i+t; //看到K了吗,这就是我们上面我们为什么只是10^5的原因,因为k就算是无符号型最大为 2^32-1,刚刚超过10^9,而s[j]<10^5,i<10^4,t<10^4,加一块最大值小于2^31-1,假如让s元素一个存6位的话,s[j]<10^6,i<10^4,t<10^4,就可能超过2^32-1了!所以s数组元素最多存5位!! s[j]=k%100000; t=k/100000; //cout<<k<<" "<<s[j]<<" "<<t<<endl; } cout<<s[0]<<" "<<s[1]<<endl;//自己测试的,如果是9的话,刚好s[0]满5位了,然后数的最高位存放到s[1]里面。。。 } for(i=N-1;!s[i];i--); //除去前导零 printf("%d",s[i]);//第一个元素不要求输出多余零 while(i) printf("%05d",s[--i]);//这些需要输出前面多余的零,这个你懂的,否则一直WA!! putchar('\n'); } system("pause"); return 0; }