HDU-1042 N! 大數乘法 (C語言)

來源:互聯網
上載者:User

這是一道簡單的數學題,求一個數(N)的階乘。但是問題是題中N給的非常大(0<=N<=10000),用for迴圈來做顯然不行了。這裡用數組來對付這些大傢伙。基本思路如下:

  1.開闢一個夠大的數組,保證大於1000!所佔的位元,我是以最大情況來估算,即1000個1000相乘,開一百萬吧,反正我們老大(Miyu)說了數組空間爛便宜。

  2.然後就是挨個來乘了(說白了,就是類比我們平時的乘法),這裡不要慣性的只要看見某位過10便想著進位,雖然這樣能做,但艱難。可以讓一位存大一點的數值,要知道,對於每一位來說,可以存下一個21億的數字。

  3.如果只是乘,不中途處理一次進位的話,那便永遠是在“個位”做乘法了,肯定不行,於是我們每乘2次處理一次進位(理由見代碼注釋),這樣變可解決這個問題了。

代碼如下:

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h> #define MAX 1000000 int N,p,res[MAX+1];  int main(){while(scanf("%d",&N)!=EOF){  p=MAX;                      //定義P為最高位指標. memset(res,0,sizeof(res));  //初始化數組 res[MAX]=1;                 //由於是乘法,初始化為 1 ,這樣0!也就為 1 了 for(int i=2;i<=N;++i){ p-=4;                   //由於 Lvsi 同志覺得做題目應不止滿足於做出 for(int j=MAX;j>=p;--j) //所以改進了一下,由 [MAX->0] 改為每次乘後 res[j]*=i;    //開闢四位進位空間,根據乘以最大數10000而來.   if(i%2==0||i==N)//讓它乘兩次處理一次進位,即把每位更新成9以下 {   //如果%3的話想想連乘 998 999 1000 之類的肯定,溢出了. for(int j=MAX;j>=p;--j) //最後進位是必須的   {int c=res[j]/10;res[j]%=10;res[j-1]+=c;} }}for(int i=0;i<=MAX;++i)  //清除前置的零. {if(res[i]!=0){p=i;break;}} for(int i=p;i<=MAX;++i)printf("%d",res[i]);puts("");}    //system("pause");    return 0;}

  提交用了875MS,努力努力。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.