我提供了以下代码片段来帮助我解决涉及数字回文的问题。我无法弄清楚这是如何工作的。我知道它涉及while循环,但我无法遵循逻辑。
public static boolean isPalindrome(int nr) {
int rev = 0;
int x = nr;
while (x > 0) {
rev = 10 * rev + x % 10;
x /= 10;
}
return rev == nr;
}
有人可以解释一下这是如何运作的吗?
答案 0 :(得分:6)
如果数字是回文数,那么rev
将等于循环结束后的数字。这是它的工作原理,使用nr
为121的样本迭代:
public static boolean isPalindrome(int nr) {
int rev = 0;
int x = nr; // 121
while (x > 0) {
rev = 10 * rev + x % 10; // x % 10 is the last digit of x when in base 10. multiplying the previous value of rev by 10 and adding x % 10 is adding the last digit of x to the next digit of rev
// step 1: rev = 10*0 + 1 = 1
// step 2: rev = 10*1 + 2 = 12
// step 3: rev = 10*12 + 1 = 121
x /= 10; // truncates the last digit of x
}
所以return语句应该是return rev == nr;
答案 1 :(得分:1)
当输入参数nr(后来的x,x> 0)做出两件事时,代码的原始片段:
public static boolean isPalindrome(int nr) {
int rev = 0;
int x = nr;
while (x > 0) {
rev = 10 * rev + x % 10; // impl., for examp. 13 / 10 = 1
x /= 10; // f truncation of x
}
答案 2 :(得分:1)
回文是一个数字,无论你是从左到右,从右到左阅读,它都是相同的。 例如 - 1221
现在执行
假设您输入了1221作为号码。 你的调用方法语句看起来像 isPalindrome(1221);
第1步 - 这里我们有三个变量nr = 1221,rev = 0和x,它们将保持原始值1221。
一旦while循环开始,它会检查x是否大于零,在我们的例子中1221大于0,这是真的,所以程序将进入循环。
然后rev = 10 * rev + x%10;
此表达式将更改rev的初始值,即零。
10 * 0 + 1221%10将给出1作为答案。因为%模数运算符给出余数所以1221除以10将得到1作为余数。
现在rev的值为1。
程序将转到下一个语句来更新x的值,因为我们已经存储了一个数字的回文条目。
x / = 10 ;
这是一个相当于的简写陈述 x = x / 10; 因此,当x除以10时,我们将得到122作为商,122将存储在x中。
第2步 - 现在,程序流将转到第一个语句(这就是循环之美),以检查当x = 122大于0时获取的条件为真。 现在,rev的值将是
rev = 10 * 1 ( remember value of rev is 1 at the moment) + 122% 10 ;
rev的新值将是 rev = 10 * 1 + 2(因为除以10时的模数或余数122为2)
根据第一个陈述的最终价值 rev = 12。
并且程序将提前更改x的值,因为我们已完成输入数字的最后两位数。
x = x / 10; which will result us the quotient of 12.
第3步 - 12大于0条件真正的程序将转移到下一个语句。
rev = 10 * rev (12) + x (12) % 10;
新的rev值 rev = 120 + 2; rev = 122
下一个语句将为我们提供x的另一个更改值,以便我们可以完成我们的回文数字。
x = x / 10;
x = 12/10; will give us 1 as quotient
第4步 - 同时再次满足条件,即1大于0
并且更新的rev值将是
rev = 10* rev (122) + 1% 10;
因为潜水1和10将给我们余数1,所以最后的表达将是 rev = 1221
现在最后一次更改是x的值 x = x(1)\ 10; x将为零,因为将1除以10时将没有商。
第5步 - 0大于0条件为false,程序将退出while,所有变量的最终值将为
nr = 1221
rev = 1221
x = 0
你方法中的一些语句将证明返回类型为布尔值。
if(nr==rev)
return true ;
else
return false;
我希望我能解释你的流程,也希望你为非回文数字运行相同的程序。