2017-06-17 42 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

地板功能。你說得對 –