尝试比较两个整数

4

这是我第一次提问,我已经尝试搜索现有的线程。我的程序旨在要求用户输入一个5位数,并检查它是否为回文数,方法是将数字反转,然后将原始数字与反转后的数字进行比较。我还加入了一些验证步骤,以拒绝长度超过或短于5位数的数字。一切似乎都正常,直到它到达比较原始数字和反转数字的部分。以下是我的代码:

import java.util.Scanner;

public class Palindromes {
    public static void main(String args[]) {
        int n, reverse = 0;
        System.out.println("Enter a 5-digit integer to see if it is a palindrome.");
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        int length = String.valueOf(n).length();
        while (length > 5 || length < 5) {
            System.out.println("Error: integer must be 5 digits in length.");
            System.out.println("Enter a 5-digit integer.");
            n = in.nextInt();
            length = String.valueOf(n).length();
        }
        while (length == 5 && n != 0) {
            reverse = reverse * 10;
            reverse = reverse + n % 10;
            n = n / 10;
        }
        System.out.println("Reversed number is: " + reverse);
        if (n == reverse) {
            System.out.println("Congratulations! Your number is a palindrome!");
        } else {
            System.out.println("Sorry.  Your number isn't a palindrome.");
        }
    }
}

2
一切似乎工作正常,直到它涉及比较原始数字和逆转的数字的部分。那么这种方式不起作用的原因是什么?您能举一个具体的例子说明发生了什么与您期望发生的情况相比有何不同吗?提示:您刚刚编写了一个仅在n为0时终止的循环。您正在循环中修改n。然后您将n与reverse进行比较...(您可能需要复制原始数字...) - Jon Skeet
2
现在是磨练调试技能的好时机。在循环之前、之中和之后设置一些断点或 println 语句,观察发生了什么。调试是一个重要的学习技能。 - ug_
2个回答

6

Look at what you are doing here!

while (length == 5 && n != 0) {
    reverse = reverse * 10;
    reverse = reverse + n % 10;
    n = n / 10; // <----- You are changing "n"!
}

这意味着在循环之后,n将不再是用户输入的那个 n

要解决这个问题,需要将 n 复制到另一个变量中,然后对其进行修改。

int temp = n;
while (length == 5 && temp != 0) {
    reverse = reverse * 10;
    reverse = reverse + temp % 10;
    temp = temp / 10;
}

感谢大家的反馈。当我最初发布代码并运行时,数字长度验证检查起作用了,但是比较n == result却没有成功。感谢Sweeper提醒我,n已经被修改了。我已经修改了长度检查,它现在看起来像这样: - jinx520
int temp = n; int length = String.valueOf(temp).length(); while (length > 5 || length < 5) { System.out.println("错误:整数长度必须为5位。"); System.out.println("请输入一个5位整数。"); n = in.nextInt(); length = n; length = String.valueOf(temp).length(); } while (length == 5 && temp != 0) { reverse = reverse * 10; reverse = reverse + temp % 10; temp = temp / 10; - jinx520
抱歉,我不知道如何格式化它。基本上,Sweeper正确指出,在n和reverse之间的比较中,我不再比较原始的n。所以我通过传递n到temp变量来纠正它,但现在长度的验证检查不起作用--如果您输入一个三位数,它会正确标记,但无法识别5位数。但是,如果您从一个5位数开始,代码将正确运行。 - jinx520
再次感谢你,Sweeper!在我添加了临时变量来修复n和reverse比较后,我意识到我需要稍微清理一下长度验证以保持与使用temp而不是n来检查长度的一致性。但现在一切都正常了。 - jinx520

3

将数字转换为数组并反转它比计算更容易:

let reverseNumber = parseInt(12345.toString().split("").reverse().join());

我知道,但在老师讲解数组之前,我们不能在这门课程中使用它们。 - jinx520

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接