我编写了这个 C 程序,它编译得很好,但是当我输入输入时,它永远不会停止运行,当我强制停止它时,它会显示“浮点异常(核心转储)”。它基本上是在更大的程序中实现的函数,但在本例中我们不需要它。那么到底是怎么回事?
这是代码块。我写main函数只是为了测试isPal函数。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int NumOfDigits(long long x) {
int sum = 1;
while (x / 10 != 0) {
sum ++;
x = x / 10;
}
return sum;
}
int isPal(long long x) {
int f, c, front, back, sum;
sum = NumOfDigits(x);
c = pow(10,(sum-2));
front = x / pow(10,(sum - 1));
back = x % 10;
f = 1;
while (x != 0 && f == 1) {
if (front == back) {
x = (x / 10) % c;
c /= 100;
sum -=2;
front = x / pow(10,sum);
back = x / 10;
} else {
f = 0;
}
}
if (f) {
return 1;
} else {
return 0;
}
}
int main() {
int f;
long long x;
scanf("%lld\n", &x);
f = isPal(x);
if (f) {
printf("yes"); }
else { printf("no"); }
}
如果您使用一位数字输入进行测试,则
sum
为 1,并且 c = pow(10,(sum-2));
将 c
设置为零,因为 10−1 = .1,在转换为 int
进行赋值时变为零到c
。然后 (x / 10) % c
除以零。
对于其他具有奇数位数的数字,
c
将以非零开始,但 c /= 100
最终会将其更改为零,再次导致 (x / 10) % c
除以零。
您需要更改代码以避免被零除。
此外,一些低质量的
pow
实现即使在数学结果完全可表示的情况下也会返回不准确的结果。例如, pow(10, 0)
可能会返回一个略小于 1 的数字,尽管它应该返回 1。您可以使用 round(pow(10, i))
而不是 pow(10, i)
(或 lround
或其他舍入函数之一)来纠正这一点。
但是,在测试输入数字是否为回文时,通常最好只是将数字作为字符串读取并直接测试字符,而不将其转换为数字。