#2559: TLE問題


B98902055 (LOGO)


#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 (學姊)


我想要嘗試用函數寫看看

這樣應該沒錯吧?

 但是一直出現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 (小可魚)


我想要嘗試用函數寫看看

這樣應該沒錯吧?

 但是一直出現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) ) 會比較快?