GNU でコードをコンパイルしg++
、 をコメントアウトし、getch()
の定義をmain()
より単純なものに変更しint main()
(コードは引数を使用しないため)、<cstdio>
および<utility>
ヘッダーを追加すると、広範な警告が表示されます。
euc.cpp: In function ‘int main()’:
euc.cpp:43:1: warning: ‘s’ is used uninitialized in this function [-Wuninitialized]
euc.cpp: In function ‘std::pair<int, int> EuclidesExtendido(int, int)’:
euc.cpp:23:5: warning: ‘r’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp:28:60: warning: ‘r’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp:30:44: warning: ‘q’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp:30:44: warning: ‘t’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp:30:44: warning: ‘s’ may be used uninitialized in this function [-Wuninitialized]
euc.cpp: In function ‘int main()’:
euc.cpp:40:29: warning: ‘s’ is used uninitialized in this function [-Wuninitialized]
euc.cpp:40:29: warning: ‘t’ is used uninitialized in this function [-Wuninitialized]
MS Visual Studio で警告レベルを上げて、このような警告が表示され、ここで質問を送信する前に修正できるようにする必要があります。初期化されていない変数を使用していることを考えると、疑似ランダムな値で遊ぶことになります。これにより、システムが予想よりもはるかに深い再帰に追い込まれ、スタック オーバーフローが発生する可能性があります。
このコードは、Mac OS X 上で自明の問題なしにコンパイルおよび実行されます。答えは次のとおりです。
21
s=-1 t=64
それがあなたが期待しているものかどうかはわかりません。21 は、231 (11x7x3) と 525 (7x5x5x3) の最大公約数です。-1 は正しくないと思われます (したがって、64 もおそらく間違っています)。
#include <cstdio>
#include <utility>
int algoritmoeuclides(int a, int b)
{
if (a % b == 0)
return b;
return algoritmoeuclides(b, a % b);
}
std::pair<int, int>division(int dividendo, int divisor)
{
int residuo = dividendo % divisor;
int resultado = dividendo / divisor;
return std::pair<int, int>(residuo, resultado);
}
std::pair<int, int>EuclidesExtendido(int a, int b)
{
if (b == 0)
return std::pair<int, int>(1, 0);
else
{
std::pair<int, int>q = division(a, b);
std::pair<int, int>s = EuclidesExtendido(b, q.second);
return std::pair<int, int>(s.second, s.first - q.first * s.second);
}
}
int main()
{
int a = 525;
int b = 231;
std::pair<int, int>p = EuclidesExtendido(a, b);
printf("%d\n", algoritmoeuclides(a, b));
printf("s=%d t=%d\n", p.first, p.second);
}