2012-05-20 105 views
0

我遇到了我的歐幾里得算法問題。我在MS Visual Studio上運行這個控制檯應用程序。當我運行它時,它說「進程因堆棧溢出異常而終止」。如何解決這個異常?

我最近張貼了關於這個算法的另一個問題,但是現在我有這個問題,這是我第一次看到它。我是一名初學者程序員。

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

這不是C,確保正確標記請。 – jedwards

+0

您應該使用調試器(或打印語句)來確定程序的流程,並查看它是否符合您的意圖。 –

+1

這是'main()'的合法聲明嗎? –

回答

4

你錯誤地收集你的函數的返回值。

儘管具有兩個值,一對是一個單獨的對象。所以

std::pair<int, int>(q, r) = division(a, b); 

應該是這樣的:

std::pair<int, int> qr = division(a, b); 

然後你可以用得到qr獨立:

int q = qr.first; 
int r = qr.second; 

您將需要做出這種改變無處不在,你有類似的錯誤。

+0

感謝它的工作 – Giuseppe

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

假設你是細使用一些C++ 11的庫功能,而不是std::pair<int, int>(s, t)要從<tuple>頭這產生一對可被分配給參考std::tie(s, t)

相關問題