2017-06-17 46 views
2

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

有人可以请解释这是如何工作的?

+2

把它写在纸上的少数... –

回答

1

回文是一个数字,你是否从左至右或从右至左读它读取相同。 例如 - 1221

现在执行

假设你已经进入了1221的号码。 您的调用方法声明看起来像 isPalindrome(1221);

步骤1 - 这里,我们有三个变量NR = 1221,转速= 0和x将作为while循环开始它检查x是否大于保持原来的值,它是1221

一旦零或不是,在我们的例子中,1221大于0,这是真的,所以程序会进入循环。

then 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 = 10 * 1 (remember value of rev is 1 at the moment) +  122% 10 ; 

转的新值将是 转= 10 * 1 + 2(因为模量或122其余部分时除以10是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; 

新转值 转= 120 + 2; 转= 122

下一条语句会给我们x的另一个变化值,使我们可以完成我们的回文数字。

x = x/10; 
x = 12/10; will give us 1 as quotient 

步骤4 - 而条件将再次被满足为1大于0

并且更新转值将是

rev = 10* rev (122) + 1% 10; 

由于潜水1与10会给我们其余的1,所以最终的表达会 转= 1221

现在的最后一次更改为v (x)= x(1)\ 10; x将为零,因为当将1除以10时不会有商。

第5步 - 0大于0的条件将是错误的,并计划将退出,同时和所有变量的最终值将是

nr = 1221 
rev = 1221 
x = 0 

几个语句中你的方法将证明回报键入布尔值。

if(nr==rev) 
    return true ; 
else 
    return false; 

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

+0

@Oliver为什么downvote – Javasist

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;

+0

添加样品重复会使你的答案的方式更好,说用'NR = 22'和解释一步迭代中的一步。 –

+0

感谢您的提示 - 添加。 –

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 
    } 
+0

现在感谢我看到发生了什么! – Oliver

+0

'X/= 10'可以在一个int完成而不会引发错误 - 它只会截断最后一位关x的10为基数基本上是没错,被抛出的X/10 –

+0

地板功能。你说得对 –