24h購物| | PChome| 登入
2009-02-11 21:22:47| 人氣1,543| 回應0 | 上一篇 | 下一篇

ACM 443 Humble Numbers

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

http://www.tcgs.tc.edu.tw/~sagit/acm/
學習↑
不過有一些部分我不太了解,所以修改一部分讓我自己了解,之前用暴力法去尋找太慢了,改用倍數尋找的方式就快囉了。

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

  1. #include<stdio.h>   
  2. #include<stdlib.h>   
  3. main()   
  4. {   
  5.  int a,b;   
  6.  int ans[5844];   
  7.  int g7,g5,g3,g2,m;   
  8.  ans[0]=1;   
  9.  for(a=1;a<=5841;a++)   
  10.   {   
  11.    for(g7=a/7;g7<a;g7++)   /*a/7只因為可能再小而已*/  
  12.     if(ans[g7]*7>m) break/*尋找比原本數大的數 就跳出*/  
  13.    for(g5=g7;g5<a;g5++)    /*大的倍數先暴,接續他的就好了,不用多跑很多*/  
  14.     if(ans[g5]*5>m) break;   
  15.    for(g3=g5;g3<m;g3++)   
  16.     if(ans[g3]*3>m) break;   
  17.    for(g2=g3;g2<m;g2++)   
  18.     if(ans[g2]*2>m) break;   
  19.    m=ans[g2]*2;   
  20.    if(m>ans[g3]*3)m=ans[g3]*3;   
  21.    if(m>ans[g5]*5)m=ans[g5]*5;   
  22.    if(m>ans[g7]*7)m=ans[g7]*7;   
  23.     ans[a]=m;      
  24.   }   
  25.   int n;   
  26.  while(scanf("%d",&n)==1&&n!=0)   
  27.   {   
  28.    if(n%10==1&&n%100!=11)/*11.12.13 唸法不同*/  
  29.     {printf("The %dst humble number is %d.\n",n,ans[n-1]);continue;}   
  30.    if(n%10==2&&n%100!=12)   
  31.     {printf("The %dnd humble number is %d.\n",n,ans[n-1]);continue;}   
  32.    if(n%10==3&&n%100!=13)   
  33.     {printf("The %drd humble number is %d.\n",n,ans[n-1]);continue;}   
  34.     printf("The %dth humble number is %d.\n",n,ans[n-1]);   
  35.   }   
  36.  return 0;   

/**************加速版本 請觀察與上的不同***********************/

#include<stdio.h>  
#include<stdlib.h>  
main()  
{  
 int a,b;  
 int ans[5844];  
 int g7=0,g5=0,g3=0,g2=0,m;  
 ans[0]=1;  
 for(a=1;a<=5841;a++)  
  {  
   for(;g7<a;g7++)   /*a/7只因為可能再小而已*/ 
    if(ans[g7]*7>m) break; /*尋找比原本數大的數 就跳出*/ 
   for(;g5<a;g5++)    /*大的倍數先暴,接續他的就好了,不用多跑很多*/ 
    if(ans[g5]*5>m) break;  
   for(;g3<m;g3++)  
    if(ans[g3]*3>m) break;  
   for(;g2<m;g2++)  
    if(ans[g2]*2>m) break;  
   m=ans[g2]*2;  
   if(m>ans[g3]*3)m=ans[g3]*3;  
   if(m>ans[g5]*5)m=ans[g5]*5;  
   if(m>ans[g7]*7)m=ans[g7]*7;  
    ans[a]=m;     
  }  
  int n;  
 while(scanf("%d",&n)==1&&n!=0)  
  {  
   if(n%10==1&&n%100!=11)/*11.12.13 唸法不同*/ 
    printf("The %dst humble number is %d.\n",n,ans[n-1]);
   else if(n%10==2&&n%100!=12)  
    printf("The %dnd humble number is %d.\n",n,ans[n-1]);
   else if(n%10==3&&n%100!=13)  
    printf("The %drd humble number is %d.\n",n,ans[n-1]);
   else
    printf("The %dth humble number is %d.\n",n,ans[n-1]);  
  }  
 return 0;  
}

    台長: 來源不明
    人氣(1,543) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
    全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
    此分類下一篇:ACM 136 Q136: Ugly Numbers
    此分類上一篇:ACM 543 Goldbach’s Conjecture

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