Хорошо, так что моя простая программа для расчета Величайшего общего делителя. Он возвращает стоимость мусора каждый раз, как 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)
Попутно, в качестве новичка вы значительно выиграете от использования iostreams C++, например cout
, вместо низкоуровневых функций C i/o, таких как printf
. Это потому, что printf
и family не выполняют проверку типов, поэтому очень легко ошибиться.
Кроме того, хотя это может звучать просто как бальдердаш, вы выиграете много, выстроив вещи правильно вертикально, то есть используя 100% -ный последовательный отступ. К счастью, есть бесплатные инструменты, которые помогают в этом. Если ваш любимый IDE или редактор не поддерживает автоматическое форматирование исходного кода, ознакомьтесь с бесплатной программой AStyle.
calculate_gcd
-int (int aa, int bb, int rem, int g)
. Это означает, что, учитываяaa
,bb
,rem
иg
, вы обещаете вернутьint
. Если ваша функция решает выполнить рекурсию, она вызывает новую копию этой функции. Это не освобождает вас от обещания вернуть целое число. Фактически, не возвращая целое число, когда вы говорите, что в результате вы получите неопределенное поведение.