[英]How Does This Palindrome Function Work?
我给出了以下代码片段来帮助我解决涉及数字回文的问题。 我无法弄清楚这是如何工作的。 我知道它涉及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;
}
有人可以解释这是如何工作的吗?
如果数字是回文数,则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;
输入参数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
}
无论是从左到右还是从右到左阅读,回文都是一个读数相同的数字。 例如 - 1221
现在执行
假设您输入了1221作为数字。 你的调用方法语句看起来像isPalindrome(1221);
第1步 - 这里我们有三个变量nr = 1221,rev = 0和x,它们将保持原始值1221。
while循环开始时,它会检查x是否大于零,在我们的例子中,1221大于0,这是真的,因此程序将进入循环内部。
然后转= 10 *转+ 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 = 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
现在最后一个变化是xx = x(1)\\ 10的值; x将为零,因为将1除以10时将没有商。
步骤5 - 0大于0条件将为false并且程序将退出while并且所有变量的最终值将为
nr = 1221
rev = 1221
x = 0
你的方法中的一些语句将证明返回类型为Boolean。
if(nr==rev)
return true ;
else
return false;
我希望我可以解释你的流程,也希望你为非回文数字运行相同的程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.