Программа для поиска наибольшего общего делителя

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

Решение

Андреас отметил, что есть и другие способы достижения цели поиска gcd, но цель этого упражнения — лучше понять некоторые базовые программные конструкции. Итак, давайте перейдем к вашему подходу.

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

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

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

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

1

Другие решения

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

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

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

1

По вопросам рекламы [email protected]