2009-05-17 07:01:25來源不明

挑戰極限 Part1 - 極限加法

作法:十億進制

此題由本人出題,因為太少人想到這個!

進階加速:(第2程式碼)把if (進位的)拿掉 發現速度更快

另外發現:每次都跑465次進位?嘗試用紀錄上一次的進位次數來做看看
因為上一次的進位+上第前2項,頂多增加一位數,但是呢,這樣跑似乎沒有比較快
(第3程式碼)

/*************************************************************/

#include<stdio.h>     
#include<stdlib.h>
#define N 20000   
#define N2 500
int math[20001][500];     
main()     
{     
      
 int a,b,n;     
    math[0][0]=0;math[1][0]=1;     
    for(a=2;a<=N;a++)     
      for(b=0;b<N2;b++)     
        {     
         math[a][b]=math[a][b]+math[a-1][b]+math[a-2][b];     
          if (math[a][b]>=1000000000)     
           {     
            math[a][b+1]=math[a][b+1]+math[a][b]/1000000000;     
            math[a][b]=math[a][b]%1000000000;     
           }     
        }     
 while(scanf("%d",&n)==1)     
  {     
   for(a=N2-1;a>=0;a--)     
     if(math[n][a]!=0)     
      {     
      printf("%d",math[n][a]);     
      for(b=a-1;b>=0;b--)     
       printf("%09d",math[n][b]);
       break;   
      }      
    printf("\n");     
  }     
 return 0;     
}

/***********************************************************/

#include<stdio.h>     
#include<stdlib.h>
int math[20001][465]={0};     
main()     
{     
 int a,b,c,n,N2=2,N=1000000000;     
    math[0][0]=0;math[1][0]=1;     
    for(a=2;a<=20000;a++)     
    {
     for(b=0;b<465;b++)     
        {
         math[a][b]=math[a][b]+math[a-1][b]+math[a-2][b];  
            math[a][b+1]=math[a][b+1]+math[a][b]/N;     
            math[a][b]=math[a][b]%N;
         }
    }  
 while(scanf("%d",&n)==1)     
  {     
   int flag=1;
   for(a=464;a>=0;a--)     
     if(math[n][a]!=0||flag==0)     
      {     
      if(flag==1)
      printf("%d",math[n][a]);     
      else
      printf("%09d",math[n][a]);
      flag=0;
      }      
    printf("\n");     
  }     
 return 0;     
}

/**********************************************************/

#include<stdio.h>     
#include<stdlib.h>
int math[20001][466]={0};     
main()     
{     
 int a,b,c,n;     
 int last[20001]={0};
    math[0][0]=0;math[1][0]=1;     
    for(a=2;a<=20000;a++)     
    {
     for(b=0;b<=last[a-1]+1;b++)     
        {
            math[a][b]=math[a][b]+math[a-1][b]+math[a-2][b];  
            math[a][b+1]=math[a][b+1]+math[a][b]/1000000000;     
            math[a][b]=math[a][b]%1000000000;
         }
      for(b=last[a-1]+1;b>=0;b--)
        if(math[a][b]!=0) {last[a]=b;break;}
    }  
 while(scanf("%d",&n)==1)
  {     
   printf("%d",math[n][last[n]]);
   for(a=last[n]-1;a>=0;a--)     
     printf("%09d",math[n][a]);
    printf("\n");     
  }     
 return 0;     
}

上一篇:矩形對角線

下一篇:漂亮數碼

xx 2009-07-10 11:27:58

我懂了~ 謝謝你喔~


不過你怎麼知道 F2000是465 * 9位阿>?

版主回應
當然是瘋狂的測試... 2009-07-10 18:22:19
xx 2009-07-09 10:53:21

可以問一下嗎?

為什麼是第2層迴圈是465?

還有最後輸出的%09d 是什麼意思阿?

版主回應
耶 過了好久終於有人留言了....先不談這個
465是因為最大的MAX次數,所以跑465是最保證一定不會錯的次數
因為F20000 會到達465*9位,一格存9位數,所以會跑那麼多...。
%09d 是不足9位補0 例如:x[5]=123好了 他只有3位
但是我要輸出9位 所以輸入會變成0,0000,0123 (輸出時不會有,)
想一想億進吧,假使我要123400089這個數字 但是我存在陣列之中
會變成(假使是一萬進...) 0089 2340 1 →89 2340 1
*************************************x[0] x[1] x[2]
因為我是用萬進,前面的0會被吃掉,所以要補0,
類推億進,了解回一聲唄...
為您補上新的程式碼
2009-07-09 17:47:53
terry0412 2009-05-24 00:51:07

謝謝你: )

你好厲害!!