我的Euclid算法问题再次出现问题。我在MS Visual Studio上运行它作为控制台应用程序。当我运行它时,它说'#34;进程因堆栈溢出异常而终止。"
我最近发布了有关此算法的另一个问题,但现在我遇到了这个问题,这是我第一次看到它。我是一名初学程序员。
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 resultado=0;
int residuo=0;
residuo=dividendo%divisor;
resultado=dividendo/divisor;
return std::pair<int, int>(residuo,resultado);
}
std::pair<int, int>EuclidesExtendido(int a,int b)
{
int q,r,s,t;
if (b == 0)
return std::pair<int, int>(1, 0);
else
{
std::pair<int, int>(q, r) = division(a, b);
std::pair<int, int>(s, t) = EuclidesExtendido(b, r);
}
return std::pair<int, int>(t, s - q * t);
}
int main(array<System::String ^> ^args)
{
int a=525;
int b=231;
int s,t;
std::pair<int, int>(s, t)=EuclidesExtendido(a,b);
printf("%d",algoritmoeuclides(a,b));
printf("s=%d t=%d",s,t);
getch();
}
答案 0 :(得分:4)
您正在错误地收集函数的返回值。
尽管有两个值,但一对是单个对象。所以
std::pair<int, int>(q, r) = division(a, b);
应该是这样的:
std::pair<int, int> qr = division(a, b);
然后您可以单独使用q
和r
:
int q = qr.first;
int r = qr.second;
你需要在有类似错误的地方进行这种改变。
答案 1 :(得分:1)
当我使用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);
}
答案 2 :(得分:0)
假设您可以使用某些C ++ 11库功能,而不是std::pair<int, int>(s, t)
,而不是std::tie(s, t)
来自<tuple>
标头的{{1}},它会创建一对可以分配给它的引用