Palindrom检查器,输出错误

时间:2014-09-04 10:57:29

标签: c

我正在尝试解决问题4 - 项目欧拉,我被困了。所以我需要一点帮助我的代码。这是我要解决的问题:

回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。

找出由两个3位数字的乘积制成的最大回文。

代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int is_palindrom(int number, int revrse) {
    char str1[6];
    char str2[6];

    sprintf(str1, "%d", number);
    sprintf(str2, "%d", revrse);

    return strcmp(str1, str2);
}

int main(void) {
    int number, revrse;
    int i, j, temp;
    int maks;

    for(i=999;i>99;i--)
        for(j=999;j>99;j--) {
            temp = number = i*j;
            while (temp != 0) {
                revrse = revrse * 10;
                revrse = revrse + temp%10;
                temp = temp/10;
            }
            if(is_palindrom(number, revrse)==0 && number > maks)
                maks = number;
        }
    printf("%d",maks);
    return 0;
}

3 个答案:

答案 0 :(得分:5)

revrse var未初始化,因此其中有垃圾。记得始终初始化一个变量!

答案 1 :(得分:2)

补充@kleszcz的答案,revrse必须始终在while循环开始之前初始化,否则,它将保留先前的值(并在第一次迭代中进行垃圾处理,因为他明智地指出)。

另一个问题是您不需要is_palindrome功能。您可以直接检查数字是否相等。

答案 2 :(得分:1)

要正确获得数字的反转形式,您需要首先为循环的每次迭代设置revrse为0的初始值,否则行为未定义。它还有助于设置maks的初始值以进行比较。最后,当你可以检查你的号码和它的反向之间的相等性时,为什么要使用一个函数来检查回文?

int main()
{
    int number;
    int i,j,temp;
    int maks = -1;
    int revrse;

    for(i=999;i>99;i--) {
        for(j=999;j>99;j--) {
            number = i*j;
            revrse = 0;
            temp=number;
            while (temp != 0){
                revrse = revrse * 10;
                revrse = revrse + temp%10;
                temp = temp/10;
            }
            if(number == revrse) {
                if(number > maks) {
                    maks = number;
                }
            }
        }
    }
    printf("%d",maks);
    return 0;
}