24h購物| | PChome| 登入
2009-07-10 19:29:21| 人氣636| 回應0 | 上一篇 | 下一篇

挑戰極限 Part3 - 阿拉伯之夜階乘

推薦 0 收藏 0 轉貼0 訂閱站台

作法:進位法+利用前一項的位數(由於是N! 上升的速度很快 速度很有很大差異)

第1程式碼 pcsh710742 的 480ms
第2程式碼 684ms

打程式的時候最好是用同一類型的型態

例如第1程式碼有些改成int不就好了嗎?通常會這樣想,不過速度會更慢

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

#include<stdio.h>        
#include<stdlib.h>        
long long a[3151][1100]={0},i,n,t=1,b[3151],c[3151],cc,d[10000];             
int main(){             
    for(n=2,a[1][0]=a[0][0]=1,b[1]=b[0]=c[0]=c[1]=1; n<3151; n++){             
        for (i=0; i<t; i++)           
            a[n][i] = a[n-1][i] * n;                               
        for (i=0; i<t; i++){           
            if(a[n][i]>=1000000000){           
                if(a[n][i+1]==0)       
                    t++;       
                a[n][i+1] += a[n][i] / 1000000000;       
                a[n][i] %= 1000000000;           
            }           
        }         
        b[n]=t;       
        cc=a[n][t-1];
        while(cc>0)       
            c[n]++,cc/=10;     
        d[(b[n]-1)*9+c[n]]=n;     
    }           
    while(scanf("%lld",&n)==1)
    {     
        if(n==1)     
            printf("Find : 0!,1!,2!,3!\n0! = 1\n1! = 1\n2! = 2\n3! = 6\n");     
        else if(n==2)     
            printf("Find : 4!\n4! = 24\n");     
        else if(n==3)     
            printf("Find : 5!,6!\n5! = 120\n6! = 720\n");     
        else if(d[n]==0)     
            printf("NO find\n");     
        else{     
            printf("Find : %lld!\n%lld! = %lld",d[n],d[n],a[d[n]][b[d[n]]-1]);     
            for(i=b[d[n]]-2; i>=0; i--)     
                printf("%09d",a[d[n]][i]);     
            printf("\n");     
        }        
    }        
   return 0;
}
  

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

#include<stdio.h>        
#include<stdlib.h>        
long long int math[3151][1101]={0};  
long long int N (long long int n)  
{  
  if(n<10) return 1;  
  if(n<100) return 2;  
  if(n<1000) return 3;  
  if(n<10000) return 4;
  if(n<100000) return 5;
  if(n<1000000) return 6;
  if(n<10000000) return 7;
  if(n<100000000) return 8;
  if(n<1000000000) return 9;
}
main()        
{        
         
int a,b,n;        
    math[0][0]=1;math[1][0]=1;
 int Nn[10000][4]={0},top[10000]={0};
 long long int last[3151]={0};
 Nn[1][0]=0;
 Nn[1][1]=1;
 top[1]=2;
 
    for(a=2;a<3151;a++)
    {
       for(b=0;b<=last[a-1]+1;b++)        
         {        
          math[a][b]=math[a][b]+math[a-1][b]*a;        
             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)
          {
            int temp=N(math[a][b])+9*b;
            last[a]=b;
            Nn[temp][top[temp]]=a;
            top[temp]++;
            break;
          }
    }
 while(scanf("%d",&n)==1)        
  {        
    if(top[n]==0) printf("NO find\n");
    else
     {
       printf("Find : %d!",Nn[n][0]);
       for(a=1;a<top[n];a++)  printf(",%d!",Nn[n][a]);
        printf("\n");
       for(a=0;a<top[n];a++)
         {
           printf("%d! = %lld",Nn[n][a],math[Nn[n][a]][last[Nn[n][a]]]);
           for(b=last[Nn[n][a]]-1;b>=0;b--)
            printf("%09lld",math[Nn[n][a]][b]);
            printf("\n");
         }
     }
  }        
 return 0;        
}

台長: 來源不明

您可能對以下文章有興趣

人氣(636) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ZeroJudge 基礎+原創題庫 |
此分類下一篇:算算算....Normal
此分類上一篇:序章-永夜抄-A

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文