2015-08-15 90 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