2015-08-15 4 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 [11], что происходит, когда вы проверяете его на другую переменную с номером? Может кто-нибудь, пожалуйста, измените это, чтобы заставить его работать и сказать мне, что случилось? Я новичок в программировании, поэтому извините мою программу, если она неуклюжая.

+1

'void main()' неверно среди ряда других вещей, таких как индексирование за пределами границ. Узнайте, как использовать отладчик для проверки вашего кода. –

+0

'i <= 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; вы хотите сказать «продолжайте, пока оба эти истины истинны», оба являются И, используйте &&, чтобы сказать это. – djna

+0

Что касается «ошибки разделения», которая обычно возникает при попытке сделать невозможное деление, например деление на ноль. Я не вижу, как это могло произойти в коде, который вы опубликовали. Вы знаете, как выполнить свой код в отладчике? Действительно стоит научиться это делать, тогда вы можете точно увидеть, где это происходит, и значения переменных в то время. В противном случае добавьте некоторые операторы печати, чтобы понять, что это происходит. – djna