这个Palindrome功能如何工作?

时间:2017-06-17 02:14:34

标签: java

我提供了以下代码片段来帮助我解决涉及数字回文的问题。我无法弄清楚这是如何工作的。我知道它涉及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;
    }

有人可以解释一下这是如何运作的吗?

3 个答案:

答案 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;

我希望我能解释你的流程,也希望你为非回文数字运行相同的程序。