Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个回文函数是如何工作的?_Java - Fatal编程技术网

Java 这个回文函数是如何工作的?

Java 这个回文函数是如何工作的?,java,Java,我得到了下面的代码片段来帮助我解决一个涉及数字回文的问题。我不知道这到底是怎么回事。我知道它涉及while循环,但无法遵循逻辑 public static boolean isPalindrome(int nr) { int rev = 0; int x = nr; while (x > 0) { rev = 10 * rev + x % 10; x /

我得到了下面的代码片段来帮助我解决一个涉及数字回文的问题。我不知道这到底是怎么回事。我知道它涉及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
        }

因此返回语句应该是
returnrev==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作为数字。 您的调用方法语句如下所示 伊斯帕林德罗姆(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(因为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;
新转速值 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;
因为10加1等于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;

我希望我可以向您解释流程,也希望您对非回文数字运行相同的程序。

在纸上写下一个小数字…添加一个示例迭代将使您的答案方式更好,用
nr=22
说,并在迭代中一步一步地解释。感谢您的提示--添加。现在我知道发生了什么了,谢谢
x/=10
可以在不引发错误的情况下对int进行处理——它只会截断以10为基数的x的最后一位。基本上它是x/10agree的楼层函数,这里是@Santiago Benoit,那里是purposly int。不会抛出任何错误。x将simpmy返回除法后的int值,这将是您的qoutient。
x = x / 10;
x = 12/10; will give us 1 as quotient