#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語言寫法)
這樣應該沒錯吧?
但是一直出現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 ) 快阿?
這樣應該沒錯吧?
但是一直出現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) ) 會比較快?