Итак, вот моя простая программа для вычисления величайшего общего делителя. Он возвращает значение мусора каждый раз так же, как 46332964. Я думал над головой в течение часа, но не могу понять проблему. После исследования я также включил прототип, но все равно не повезло. Это работает, пока не вернется. Пожалуйста, скопируйте код и запустите его, и, пожалуйста, помогите мне.
#include <iostream>
using namespace std;
int calculate_gcd(int aa, int bb, int rem, int g);
int main()
{
int a, b;
int rem = -1;
int gcd=0;
cout << "Number 1: "; //taking inputs
cin >> a;
cout << "Number 2: ";
cin >> b;
if (a < b) //swapping if number greater than the number according to the code
{
a = a + b;
b = a - b;
a = a - b;
}
gcd = calculate_gcd(a, b, rem, gcd);
if (a <= 0 || b <= 0)
{
rem = 0;
cout <<"GCD doesnot exists\n";
} //just in case of zeros
else
cout << "\nthe GCD of "<<a <<" and "<<b <<" is "<<gcd <<"\n\n"; //the main answer
system("pause");
return 0;
}
int calculate_gcd(int aa, int bb, int rem, int g)
{
if (rem != 0)
{
if (aa%bb == 0)
{
rem = 0;
g = bb;
printf("**GCD is %d\n", g);
}
else {
rem = aa % bb;
aa = bb;
bb = rem;
}
calculate_gcd(aa, bb, rem, g);
}
else {
printf("**here also GCD is correct as %d \n", g);
return g; //returning
}
}
Вы пропускаете возврат. Вы должны использовать return calculate_gcd(aa, bb, rem, g);
вместо того, чтобы просто повторяться.
Вы можете поймать это с помощью Clang, используя -Wreturn-type
, Другие компиляторы, вероятно, также имеют предупреждение для этого.
Функциональная головка
int calculate_gcd(int aa, int bb, int rem, int g)
указывает, что g
является передано по значению.
Это означает, что при вызове указанное значение копируется в локальный вызов этой функции g
, Изменения к этому местному g
не влияют на вызывающий сайт.
Вместо этого вы должны return
результат функции, и тогда вам не нужно g
аргумент:
int calculate_gcd(int aa, int bb, int rem)
Более тщательный анализ покажет вам, что вам не нужно rem
аргумент тоже так:
int calculate_gcd(int aa, int bb)
Попутно, как новичок вы очень выиграете от использования C ++ iostreams, лайк cout
вместо низкоуровневых функций ввода / вывода типа C printf
, Это потому что printf
и семья не выполняет никакой проверки типов, поэтому очень легко ошибиться.
Кроме того, хотя это может звучать как просто балдерш, вы выиграете много, правильно выровняв вещи по вертикали, то есть, используя 100% согласованность вдавливание. К счастью, есть бесплатные инструменты, которые помогут с этим. Если ваш любимый IDE или редактор не поддерживает автоматическое форматирование исходного кода, воспользуйтесь бесплатной программой AStyle.