以下是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;
}
答案 0 :(得分:0)
int getmod(string b,int a)
{
int n=b.size();
int d;
d= (b[0]-'0') % a;
如果a = 0
,则会出错,因为% 0
就像是除以零。根据问题陈述,a
可以为零。
SIGFPE信号报告致命的算术错误。虽然名称源自“浮点异常”,但此信号实际上涵盖所有算术错误,包括除零和溢出。如果程序将整数数据存储在随后用于浮点运算的位置,则这通常会导致“无效操作”异常,因为处理器无法将数据识别为浮点数。
您可以通过检查是否a == 0
并在这种情况下简单地返回b
作为答案来解决问题。否则按原样调用当前函数。