检查数字是否为回文的 C 程序

问题描述 投票:0回答:1

我编写了这个 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"); }
}
c palindrome
1个回答
1
投票

如果您使用一位数字输入进行测试,则

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
或其他舍入函数之一)来纠正这一点。

但是,在测试输入数字是否为回文时,通常最好只是将数字作为字符串读取并直接测试字符,而不将其转换为数字。

© www.soinside.com 2019 - 2024. All rights reserved.