Программа для нахождения наибольшего общего делителя

Вот программа на С++, которую я пытался написать для вышеуказанного вопроса. Наш учитель сказал нам использовать цикл 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], что произойдет, если вы проверите его на другую переменную с числом? Может кто-нибудь изменить это, чтобы заставить его работать и сказать мне, что не так? Я новичок в программировании, так что извините мою программу, если она корявая.


person SMcCK    schedule 15.08.2015    source источник
comment
void main() является неправильным среди ряда других вещей, таких как индексация за пределами границ. Узнайте, как использовать отладчик для проверки кода.   -  person πάντα ῥεῖ    schedule 15.08.2015
comment
i<=m,j<30 не делает то, что вы думаете... вы, вероятно, хотели && вместо ,   -  person Jarod42    schedule 15.08.2015


Ответы (2)


Андреас указал, что есть и другие способы достижения цели нахождения НОД, но цель упражнения состоит в том, чтобы лучше разобраться с некоторыми базовыми конструкциями программирования. Так что давайте с вашим подходом.

Ваша идея состоит в том, чтобы вычислить два списка делителей, а затем сравнить их. Как вы говорите, наличие списка с пробелами усложняет задачу.

Так что адаптируйте свой цикл, увеличивайте индекс хранилища только тогда, когда вы что-то сохранили.

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;
  }
}

Это должно помочь.

person djna    schedule 15.08.2015
comment
Я понимаю и реализовал изменение в инкременте. Я снова попытался скомпилировать, и на этот раз я получил ошибку разделения вывода. Я даже не знаю, что это значит. Пожалуйста, помогите. Я не могу понять &&. Это множественная инициализация, и я не могу поставить && там. Как именно я должен использовать &&? - person SMcCK; 15.08.2015
comment
В условном цикле for; вы хотите сказать, продолжайте, пока обе эти вещи верны, обе являются И, используйте &&, чтобы сказать это. - person djna; 15.08.2015
comment
Что касается ошибки деления, то обычно это когда вы пытаетесь выполнить невозможное деление, например деление на ноль. Я не понимаю, как это могло произойти в коде, который вы разместили. Вы знаете, как выполнить код в отладчике? Этому действительно стоит научиться, тогда вы сможете точно видеть, где что-то идет не так, и значения переменных в данный момент. В противном случае добавьте несколько операторов печати, чтобы понять, что происходит. - person djna; 15.08.2015

Попробуй это:

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

Взято отсюда: https://codereview.stackexchange.com/questions/66711/greatest-common-divisor

person Andreas Hartmann    schedule 15.08.2015