2013-09-28 20 views
1

好了,所以相對黃金是指兩個數字沒有共同的因素大於1,它也可以被看作是有gcd上述= 1相對主要檢查?

兩個號碼所以沿着這些線路,這是我寫找到兩個代碼相對素數E,Z:

for(e = 0,flag=0; (flag==1); e++){ 
    if(gcd(e, z) == 1){ // z in this example is 60 
     flag = 1; 
    } 
} 

printf("e = %d\n",e); 

和GCD函數定義爲:

int gcd(int i, int x){ 
    if(x % i == 0) return(i); 
    return(gcd(x % i, x)); 
} 

當我設置z = 60,電子我得到的是e= 0 ...其實我一直得到相同的e與我初始化for循環

我做錯了什麼?如果兩個數字相對較好,還有其他方法嗎?

編輯:

好按從MiniTech移動這裏的建議是修改後的代碼:

for(e = 2,flag=0; !flag; e++){ 
    if(gcd(e, z) == 1){ 
     flag = 1; 
    } 
} 

現在當我把我的Z = 60,我的e是走出來爲E = 60這​​又是錯誤的。正確的答案應該是E = 7

+0

你的'gcd'函數不健壯,如果用'i = 0'調用,它除以零。 – starblue

回答

1
  • 你不應該在零
  • 開始你的flag條件應該是!flag

固定的是,你總是會得到1後,因爲它是相對素一切。嘗試從z - 1開始,如果你想要最大的一個,則遞減。你也應該只是break;而不是保持一個標誌。

+0

我根據你的建議修改了代碼(請參閱編輯)..但是現在我得到了e = 60。這又是錯誤的。正確的e應該是7 – sukhvir

+1

@sukhvir:Euclid的GCD算法看起來像'int gcd(int a,int b){if(!b)return a;返回gcd(b,a%b); }'。 – Ryan

+0

這工作..謝謝 – sukhvir

1

這有點脆弱,因爲它不能處理零參數;例如,

gcd(z, z) = gcd(z, 0) = gcd(0, z) = |z|.

我喜歡的東西去:

unsigned gcd (unsigned u, unsigned v) 
{ 
    unsigned t; 
    for (; (t = v) != 0; u = t) 
     v = u % v; 
    return u; 
} 

我用無符號類型,因爲沒有理由使用負參數 - 它們不影響GCD的結果,這總是非負面的。