2015-08-15 86 views
1

這裏是一個C++程序,我試圖爲上面的問題寫。我們的老師告訴我們使用for循環。程序找到最大的公約數

void main() 

int A[30],B[30],m,n,i,j,x,z; 

cout<< "enter two numbers"; 
cin>>m>>n; 
for(i=1,j=0;i<=m,j<30;i++,j++) 
{ 
    if(m%i==0) 
    { A[j]=i; 
    z=j; 
    } 
} 
for(i=1,j=0;i<=n,j<30;i++,j++) 
{ 
    if(n%i==0) 
    { B[j]=i; 
    x=j; 
    } 
} 

for(i=z;i>=0;--i) 
{ 
    for(j=x;j>=0;--j) 
    { 
    if(A[i]==B[j]) 
     { cout<<"gcd="<<A[i]; 
     } 
    } 
} 
} 

輸出顯示「輸入兩個數字:」當我輸入15和圖3,我得到的結果是閃爍的光標。通過這個程序,我意識到存儲在A和B數組中的每個數字的除數不是連續存儲的,或者是間隔的。如果內存中沒有任何內容表示A [11],那麼當您使用數字檢查另一個變量時會發生什麼?有人可以修改這個,使其工作,並告訴我什麼是錯的?我是編程新手,所以如果笨拙,請原諒我的程序。

+1

'void main()'在諸如超出範圍索引等許多其他事情中是錯誤的。請學習如何使用調試器來檢查您的代碼。 –

+0

'我<= m,j <30'不會做你的想法......你可能想''而不是'',' – Jarod42

回答

1

安德烈亞斯指出,還有其他的方式來實現尋找最大公約數的目標,但這次演習的重點是更好地處理一些基本的編程結構。所以讓我們繼續你的方法。

你的想法是計算除數的兩個列表,然後比較它們。正如你所說,有一個缺口列表使得這更難。

所以適應你的循環,只是增加存儲索引當你存儲的東西

for(i=1,j=0;i<=m && j<30;i++) // need the && here; a comma means something different 
{ 
    if(m%i==0) 
    { A[j++]=i; 
    z=j; 
    } 
} 

其次,你有你沒有B中存儲一個錯字,所以修復

for(i=1,j=0;i<=n && j<30;i++) 
{ 
    if(n%i==0) 
    { B[j++]=i; //B here not A 
    x=j; 
    } 
} 

這應該有所幫助。

+0

我理解並已經實現了增量的變化。我試着再次編譯,這次我得到了輸出「分割錯誤」。我甚至不知道這意味着什麼。請幫忙。我無法理解&&。這是多個初始化,我不能把&放在那裏。我應該怎樣使用&&? – SMcCK

+0

在for循環的條件中;你想說「只要這些事情都是真的,就繼續下去」,都是AND,用&&來說。 – djna

+0

至於通常在您嘗試進行不可能的分割時出現的「分割錯誤」,如除以零。我看不到您發佈的代碼中可能發生的情況。你知道如何在調試器中遍歷你的代碼嗎?真的值得學習這麼做,那麼你可以準確地看到它出錯的地方以及當時變量的值。否則,添加一些打印語句來了解它發生了什麼。 – djna