#2559: TLE問題


B98902055 (LOGO)

學校 : 不指定學校
編號 : 8531
來源 : [140.112.91.122]
最後登入時間 :
2009-12-26 12:19:37
a024. 最大公因數(GCD) | From: [61.230.13.178] | 發表日期 : 2009-10-27 21:31

#include <stdio.h>
#include <stdlib.h>


int gcd(int x,int y){

   
      if(x==0)
         return y;  

      if(x>y)
         return gcd(x%y,y);
      else     
         return gcd(y,x);

}


int main(){

   int a,b;
   while(scanf("%d %d",&a,&b)!=EOF)
   printf("%d\n",gcd(a,b));


   return 0;
}

 

 

我想要嘗試用函數寫看看

這樣應該沒錯吧?

 但是一直出現TLE

是真的演算法不夠好嗎? 還是只是存脆有資測造成無線迴圈

 

大家都怎麼寫的呢(C語言寫法)

 
#2560: Re:TLE問題


example (學姊)

學校 : 臺北市立麗山高級中學
編號 : 6634
來源 : [60.250.138.144]
最後登入時間 :
2022-08-09 17:07:42
a024. 最大公因數(GCD) | From: [118.166.114.159] | 發表日期 : 2009-10-27 23:49

我想要嘗試用函數寫看看

這樣應該沒錯吧?

 但是一直出現TLE

是真的演算法不夠好嗎? 還是只是存脆有資測造成無線迴圈

 

大家都怎麼寫的呢(C語言寫法)

 寫法沒有錯

 但是在遞迴中﹔

 if(x>y)
     return gcd(x%y,y);
 else     
     return gcd(y,x);

 只要一執行到 else 的部分遞迴就會多跑一次

 所以你可以把這裡簡化

 在上面的 if( x == 0 ) 可以不用拘泥於一定要 x 為零

 可以改成

 if( x == 0 || y == 0 )

     printf("%d", x==0 ? y : x );

 

 不過這裡我也有一個疑問

 

 如果寫成 if( x*y == 0 ) 會不會比 if( x == 0 || y == 0 ) 快阿?

 
#2569: Re:TLE問題


yuscvscv (小可魚)

學校 : 國立臺南第一高級中學
編號 : 2401
來源 : [140.112.16.132]
最後登入時間 :
2015-10-06 00:22:20
a024. 最大公因數(GCD) | From: [118.171.148.197] | 發表日期 : 2009-10-28 21:33

我想要嘗試用函數寫看看

這樣應該沒錯吧?

 但是一直出現TLE

是真的演算法不夠好嗎? 還是只是存脆有資測造成無線迴圈

 

大家都怎麼寫的呢(C語言寫法)

 寫法沒有錯

 但是在遞迴中﹔

 if(x>y)
     return gcd(x%y,y);
 else     
     return gcd(y,x);

 只要一執行到 else 的部分遞迴就會多跑一次

 所以你可以把這裡簡化

 在上面的 if( x == 0 ) 可以不用拘泥於一定要 x 為零

 可以改成

 if( x == 0 || y == 0 )

     printf("%d", x==0 ? y : x );

 

 不過這裡我也有一個疑問

 

 如果寫成 if( x*y == 0 ) 會不會比 if( x == 0 || y == 0 ) 快阿?


你可以寫個for迴圈跑100000次試試看。

 不過感覺不會比較快。

 說不定

if ( !(x | y) ) 會比較快?

 
ZeroJudge Forum