九度oj-1076

题目描述:

输入一个正整数N,输出N的阶乘。

输入:

正整数N(0<=N<=1000)

输出:

输入可能包括多组数据,对于每一组输入数据,输出N的阶乘

样例输入:

4
5
15

样例输出:

24
120
1307674368000

代码

#include <iostream>  
#include <cstring>  
using namespace std;  

int result[10000];  

int main(){  
    int n;  
    while(cin>>n){  
        memset(result,0,sizeof(result));  
        result[0] = result[1] = 1;  //其中result[0]表示位数,result[1]表示第一位是1  
        for(int i=2;i<=n;i++){  
            for(int j=1;j<=result[0];j++)  
                result[j] = result[j] * i;  
            for(int k=1;k<=result[0];k++){  
                if(result[k] >= 10){  
                    result[k+1] += result[k] / 10;  
                    result[k] = result[k] % 10;  
                    if(k == result[0])  
                        result[0] ++;  
                }  
            }  
        }  
        for(int i=result[0];i>=1;i--)  
            cout<<result[i];  
        cout<<endl;  
    }  
    return 0;  
}  

作者提醒:

看到此题,第一个反映是差不多应该用递归做。 然后再一看,N的最大范围到了1000,
很明显,long long 型也肯定存不下,因为阶乘的运算增长速率是最快的。 
然后考虑 用字符串数组来保存结果。 首先,将每位的数字与 当前的n相乘,
把乘的结果就保存在每一位上,然后将每一位上大于10的那个数进行进位,无非是 求模,取余的工作
其中,result[0]表示的位数,result[1],result[2],result[3]……
分别表示第一位,第二位,第三位(个位、十位、百位)……上的数