Problem 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
2
6
這道題目有一些東西特別要注意:
1.0的階乘是存在的!0!=1,我當初提交這道題目是在這一點上吃了不少的虧!我開始是是寫的while(cin>>n && n>0);交上去的時候老是報錯!但是我就納悶了,沒錯啊!後來才發現,這句應該寫成while(cin>>n && n>=0);或者while(scanf("%d",&n)!=EOF);
2.10000的階乘是在是太大了!我的數組開4000居然還是錯,開8000還錯!後來索性開個10000,居然對了!太吃驚!
[cpp]
//首先需要肯定,程序是正確的
//這算是大數乘除法!記住他們是如何處理的!由於數據很大,用基本數據類型根本無法滿足要求,只能用數組來表示!
//大數乘法!10000!的階乘是在太大!幾次數組開小了都報錯誤!
#include <iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
#define MAX 10000
#define BASE 100000//base只是一個基度,對最終取值並沒有影響,相反,base取值愈大,計算量愈小
//base發生改變的時候,下面的輸出也要相應地做出調整,否則也會輸出錯誤答案!除非當base取10!
int h[MAX];
//這是我第二次接觸大數的乘法!現在復習一下吧!很好的算法!
int main()
{
int i,j,k,carry;
int n;
while(scanf("%d",&n)!=EOF)
{
memset(h,0,MAX*sizeof(int));//賦值,每一個都置為0
for(i=1,h[MAX-1]=1;i<=n;++i)//運用遞歸,並且h[1]=1;
for(k=MAX-1,carry=0;k>=0;--k)//從最後一位開始相乘,依次向前與每一位相乘
{
carry+=i*h[k];
h[k]=carry%BASE;
carry/=BASE;//carry表示進位
}
for(j=0;j<MAX && h[j]==0;++j);//從0位開始搜索,找到不為0的第一個數
printf("%d",h[j++]);//像是這個輸出,就很妙了,第一位可能不足五位,就地輸出!
for(;j<MAX;++j)
printf("%05d",h[j]);//處在中間的值也可能沒有五位,這時候要注意了,往左邊加0,湊足5位,不然答案會出錯!
printf("\n");
}
//system("pause");
return 0;
}