繁体   English   中英

这个Palindrome功能如何工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM