2014-02-17 123 views
-5

以下是面試問題......你怎麼開始解決這樣一個問題?有這樣一個問題的一般算法嗎?這個方法做什麼 - 面試

問題是解釋這個方法做了什麼。我知道,她給出了一些投入我試圖(和它的OK),但我真的不知道如何下手解決這類的問題...

public boolean what (int num) 
{ 
    boolean ans = true; 

    for (int x = 2; (x*x <= num) && ans; x=x+1) 
    { 
     if ((num % x) == 0) 
      ans = false; 
    } 

    return ans; 
} 

THX!

+0

做過並得到了對我沒有意義的結果......這個結果很好,因爲我在真正的測試中測試了它... – Batman

+0

一個顛倒的英雄。只是嘗試一些輸入,並嘗試使用一些常識,沒有其他可選的方式。 – Adam

回答

1

反向engeering過程,您可以按照提供一些示例輸入並獲取輸出,通過該輸出可以確定結果。

明智地選擇你的輸入,以便它可以很容易地解決問題。

在目前的情況下 -

輸入:1返回:真
輸入:2返回:真
輸入:3返回:真
輸入:4返回:假
輸入:5返回:真
...
輸入:9的回報:假//aha...it似乎是素數
...
輸入:111回:假

所以在這種情況下,它的素數邏輯。

+0

所以你說的是真正的交易這裏只是嘗試一些常見的數學問題,並嘗試檢查出來? – Batman

+0

yah ...用其他術語 –

1

它檢查num是否是主要的。

要找出一種方法讀取代碼並嘗試瞭解它在做什麼。你也可以嘗試一些輸入。對於好的代碼,變量和方法的名字也有很大的幫助(這裏不是這種情況)。

但是,如果該方法實現的算法不知道,而且您不知道正在解決的問題的上下文,則可能永遠無法找出它的功能。

+0

你能解釋我可以得到這個答案的方式嗎? (已經在紙上跑了)... – Batman

+0

vars和目的方法的名稱沒有說什麼......這是一個挑戰問題,因此沒有他們的名字...... – Batman

1

你可以用幾個隨機輸入 找到它運行的方法,並試圖找出你給出的INPUT和出現的OUTPUT之間的關係。

在得出結論之前,先檢查它已知輸出,然後聲明您的答案。

2

設NUM = 10

public boolean what (int num) 
{ 
    boolean ans = true; 

    for (int x = 2; (x*x <= num) && ans; x=x+1) 
{    //^ multiply x with x will give (4,9).. When x = 4, than (16<= num) = false 
    if ((num % x) == 0) // divide 10 by (2,3) if reminder is zero that means 10 is not prime 
     ans = false; // set ans to false so that for loop can be terminated or just break; 
} 

return ans; 

}

+0

10是一個素數? –

+0

@KamleshArya,這是小錯字 –

+0

你怎麼得出的結論,x通過序列4,6,8,... – Henry

1

在上述程序中最初假設數目爲不是素數。如果任何大於2且小於或等於數字平方根的數字除以給定數字,則該數字不是素數。

如果數字不是素數,則該方法返回true,如果數字是質數,則返回false。

0

方法的目的:找出素數。

如果輸入數字是素數,則此方法會輸出booleaan ans ='true'。 否則它會返回false值。

由此可見,以找出是否一個數是質不是最簡單的邏輯..

例如,如果一個數字是11, 第1步 - 我們用NUM直到(NUM * NUM)乘以它是小於11. {因爲所有可能的情況都被測試,所以不需要測試超過值大於num * num的值}。

第2步 - 檢查是否將11/2的剩餘部分是零或不是,如果餘數不爲0則11不prime.if它分裂我們回到步驟1

所以循環會。 。

步驟1 NUM = 11,X = 2

步驟2 11%2!= 0所以轉到步驟1,NUM undivisible

步驟1 NUM = 11,X = 3

步驟2 11 %3!= 0

步驟1 num = 11,x = 4但x * x = 16和16> 11因此不再有循環,11是素數,因爲它不能被任何數字整除直到x = 3。

另一個例子可以是38 .. 步驟1 NUM 38,x = 2時

步驟2 38%2 == 0,所以餘數=零和ANS =假因而不再通過循環和 '38'不是素數。

一個更高級的方法來找到一個數字,如果它的素數或不是可以測試其可分性只針對素數。如果我們有相當大的數字作爲輸入,這實際上更高效。

public boolean what (int num) // number to be tested is passed 
{ 
boolean ans = true; // default value 
     for (int x = 2; (x*x <= num) && ans; x=x+1) //looping till num is found divisibl 
     { 
      if ((num % x) == 0) 
      ans = false; // ans is false in case num is not prime 
     } 
     return ans; // num is prime 
} 

希望解釋幫助..如有任何疑問或幫助,請通知我。