为啥我的 SPOJ GCD2 代码在 SPOJ 上出错?

Posted

技术标签:

【中文标题】为啥我的 SPOJ GCD2 代码在 SPOJ 上出错?【英文标题】:Why does my code for SPOJ GCD2 error on SPOJ?为什么我的 SPOJ GCD2 代码在 SPOJ 上出错? 【发布时间】:2015-08-31 18:05:22 【问题描述】:

以下是SPOJ GCD2 的代码。它在我的机器和 Ideone 上运行良好,但在 SPOJ 上出现运行时错误 (SIGFPE)。我已经检查了 spojtoolkit.com 上的所有测试用例。

我无法弄清楚为什么此代码在 spoj 上显示运行时错误 (SIGFPE)。 SIGFPE 表示错误的算术运算。

为什么这段代码在 SPOJ 上显示运行时错误?

#include <bits/stdc++.h>

using namespace std;

int gcd(int x,int a)

    if(a==0)
        return x;
    else
        return gcd(a, x%a);



int getmod(string b,int a)

    int n=b.size();
    int d;
    d= (b[0]-'0') % a;
    for(int i=1; i!=n; i++)
    
        d=d*10;
        d=d + (b[i]-'0');
        d= d % a;
    
    return d;


int main()

    int tc;
    cin >> tc;
    int a;
    string b;
    while(tc--)
    
        cin >>a>>b;
        int x=getmod(b,a);
        cout << gcd(x,a)<<endl;

    
    return 0;

【问题讨论】:

请求 SPOJ 会不断在 *** 上生成不良内容。如果您的问题中没有任何进一步的研究和调试工作,请停止询问此类问题。 【参考方案1】:
int getmod(string b,int a)

    int n=b.size();
    int d;
    d= (b[0]-'0') % a;

如果a = 0,这会出错,因为% 0 就像被零除。 a 根据问题陈述可以为零。

错误covers division by zero:

SIGFPE 信号报告一个致命的算术错误。虽然名称来源于“浮点异常”,但这个信号实际上涵盖了所有算术错误,包括除以零和溢出。如果程序将整数数据存储在某个位置,然后用于浮点运算,这通常会导致“无效运算”异常,因为处理器无法将数据识别为浮点数。

您可以通过检查 a == 0 并在这种情况下简单地返回 b 作为答案来修复它。否则按原样调用您当前的函数。

【讨论】:

以上是关于为啥我的 SPOJ GCD2 代码在 SPOJ 上出错?的主要内容,如果未能解决你的问题,请参考以下文章

SPOJ7258

spoj 中的 SIGSEGV 错误,但在 ideone 中工作正常

在 SPOJ 上解决 JUICE 时,此解决方案有啥问题?

SPOJ 7258 Lexicographical Substring Search(后缀自动机)

SPOJ 10628. SPOJ COT Count on a tree

SPOJ-下一个回文