我可以在C中获得关于这个`isPalindrome()`函数的一些反馈吗?

时间:2010-10-29 01:11:48

标签: c palindrome

我在C中写了一些有用的函数。其中一个是isPalindrome()

我想确定一个数字是否是回文,我应该......

  • 获取数组中的所有数字
  • 使用两个索引进行迭代 - 从0开始,一个到数组计数
  • 在匹配数组的同时递增/递减索引,如果数组计数达到0,我们有一个回文(即完成遍历所有数字)。

我想出了......

int isPalindrome(int num) {

    int places[100];
    int i = 0;
    while (num > 0) {
        places[i++] = num % 10; 
        num /= 10;
    }

    int j = 0;
    while (i >= 0 && places[j++] == places[--i]) {
    }
    return i == -1;

}

这一般是怎么做的?

我自己在学习C语,虽然我可以告诉我的代码何时编译并且不需要整天工作,但我没有任何专家眼睛告诉我如果我走在正确的轨道上。

那么,对我的代码有任何改进或建议吗?

非常感谢!

4 个答案:

答案 0 :(得分:5)

您只需在i > j时循环播放。 i <= j后,您只是第二次检查所有字符。

答案 1 :(得分:2)

尽管在下面使用内联++--运算符可能看起来很聪明:

while (i >= 0 && places[j++] == places[--i]) { 
} 

如果将放在循环体中,您的代码将更容易阅读:

while (i >= 0 && places[j] == places[i-1]) { 
    j++;
    i--;
} 

这样,代码的读者就不必考虑在条件测试中更改ij的值可能产生的副作用。可能对编译代码的速度没有可测量的影响(但是,如果性能对此函数很重要,则应该与编译器一起检查)。

此外,您还有一个错误,如果places[-1]您将访问i == 0

答案 2 :(得分:1)

我只是使用sprintf“将字符串转换为数字”:

char places[100];
sprintf(places, "%i", num);
i = strlen(places);

答案 3 :(得分:1)

在java中

static boolean isPalindrome(String p) {
    return p.equals(new StringBuilder(p).reverse().toString());
}

在c ++和c

int IsPalindrome(char *string) {
    int bottom = 0, top;

    top = strlen(string) - 1;
    while(bottom < top && string[bottom] == string[top]) {
        ++bottom;
        --top;
    }
    return (bottom >= top ? 1:0);
}

注意,如果您需要为数字输入执行此操作,则需要编写 itoa 函数。或者使用(link)。

这是如何完成的。这也适用于所有基地而不仅仅是10个。