程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 杭電1042—— N!(大數乘法的應用!)

杭電1042—— N!(大數乘法的應用!)

編輯:C++入門知識


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; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved