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;
}

posted @ 2014-12-11 12:38  __夜风  阅读(143)  评论(0编辑  收藏  举报