"5"有什么问题?纸上的一切都很好

Moh*_*adi 0 c++ math

这是我们应该用C++解决的问题:

GCD ( 2m , 2n )         =  2 * GCD( m , n )
GCD ( 2m , 2n+1 )       = GCD ( m , 2n+1 )
GCD ( 2m+1,  2n+1 ) = GCD ( n-m , 2m+1 )  (m<n)
GCD ( m , m )       = m
Run Code Online (Sandbox Code Playgroud)

这是我写的功能:

int GCD(int n1, int n2)
{
    bool n1Zoj, n2Zoj;
    n1Zoj = (n1%2 == 0);
    n2Zoj = (n2%2 == 0);

    if(n1Zoj && n2Zoj)
        return 2 * GCD(n1/2, n2/2);

    if(n1Zoj && !n2Zoj)
        return GCD(n1/2, n2);

    if(!n1Zoj && !n2Zoj)
        return GCD((n2-n1)/2, n1);

    if(n1 == n2)
        return n1;
}
Run Code Online (Sandbox Code Playgroud)

(*"Zoj"在我的语言中表示"均匀"(波斯语))

当我传递5作为第二个参数时,程序崩溃并打印此消息:

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

退出代码是139.我在ubuntu 12.04上使用Code :: Blocks,它使用g ++作为编译器.

更新:程序崩溃与5,10,15,20,25,...

更新:我认为正确的功能形式是:

int GCD(int n1, int n2)
{
    if (n1 > n2)
        std::swap(n1, n2);

    //std::cout<<"GCD is called with params: "<<n1<<" & "<<n2<<std::endl;
    bool n1Zoj, n2Zoj;

    n1Zoj = (n1%2 == 0);
    n2Zoj = (n2%2 == 0);

    if(n1 == n2)
        return n1;

    if(n1Zoj && n2Zoj)
        return 2 * GCD(n1/2, n2/2);

    if(n1Zoj && !n2Zoj)
        return GCD(n1/2, n2);

    if(!n1Zoj && n2Zoj)
        return GCD(n2/2, n1);

    if(!n1Zoj && !n2Zoj)
        return GCD((n2-n1)/2, n1);
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 9

当(n1Zoj && n2Zoj)评估为真时,你做什么?你打电话

return 2 * GCD(n1, n2);
Run Code Online (Sandbox Code Playgroud)

它使用完全相同的参数调用函数,导致无限递归,烧坏堆栈和堆栈溢出(分段错误).

Protip - 学习调试 - 我不能强调这是多么重要.