我正在用Java做一些练习课程,并参加了这个回文数字练习,告诉我这个数字是否是回文,我得到了正确的输出但是我试图向自己解释该程序逐行工作,在到达特定行时,我注意到该部分似乎没有加起来,这是代码:
public class Palindrome {
public static void main(String[] args) {
int p = 252;
if(isPalindrome(p)) {
System.out.println("Palindrome");
} else {
System.out.println("Not palindrome");
}
}
public static boolean isPalindrome(int x) {
int num = x;
int rev = 0;
while (num != 0) {
int rmd = num % 10;//the remainder of 252 is 2
rev = rev * 10 + rmd;//rev which is 0 multiplied by 10 is 0 + 2 is 2
num = num / 10;
}
if (x == rev) {//x = 252 and rev = 2
return true;
}
return false;
}
}
部分中的:if(x == rev)
当252不等于2时,它怎么可能是真的?谢谢你们..
答案 0 :(得分:1)
你必须看看循环过程中发生的事情。
对于像这样的简单程序,纸笔方法可以正常工作。对于更复杂的程序,添加"调试打印"帮助您了解正在发生的事情:
int iterationCount = 0;
while (num != 0) {
System.out.println("Before iteration="+iterationCount+" num="+num+" rev="+rev);
int rmd = num % 10;//the remainder of 252 is 2
rev = rev * 10 + rmd;//rev which is 0 multiplied by 10 is 0 + 2 is 2
num = num / 10;
System.out.println("After iteration="+iterationCount+" num="+num+" rev="+rev);
iterationCount++;
}
此produces以下输出:
Before iteration=0 num=252 rev=0
After iteration=0 num=25 rev=2
Before iteration=1 num=25 rev=2
After iteration=1 num=2 rev=25
Before iteration=2 num=2 rev=25
After iteration=2 num=0 rev=252
Palindrome
请注意num
如何降低到零,而每次迭代rev
增长到252
。
答案 1 :(得分:0)
rev
仅在while
循环的第一次迭代时为2,在第二次迭代时为25,在第三次迭代rev
为252。
if (x == rev) {//x = 252 and rev = 2
return true;
}
return false;
这种情况也可以简化为:
return x == rev;
答案 2 :(得分:0)
以下是发生的事情:
while (num != 0) {
int rmd = num % 10; // take the last digit of num
rev = rev * 10 + rmd; // append it to rev (rev * 10 shifts to the left, and then we add)
num = num / 10; // remove it from num
}
由于它会在num
为零之前重复,rev
最终将包含反转的num
。那么显然如果反转的数字与原始的x
相同,那么它就是一个回文。
嗯,这至少在理论上是这样的。在实践中,该算法存在一个错误:对于大数字(例如任何以3或更大结尾的10位数字),反转将可能溢出。有a much better solution。