2012-01-27 52 views
2

得如何驗證碼爲5多的5檢查

bool isMultipleof5(int n) 
{ 
    /* If n is a multiple of 5 then we make sure that last 
     digit of n is 0 */ 
    if ((n&1) == 1) 
     n <<= 1; 

    float x = n; 
    x = ((int)(x*0.1))*10; 

    /* If last digit of n is 0 then n will be equal to (int)x */ 
    if ((int)x == n) 
     return true; 

    return false; 
} 
+4

if((n%5)== 0)如何返回true;返回false;'? – sharptooth 2012-01-27 14:15:22

+6

或'return(n%5)== 0;' – Mat 2012-01-27 14:16:12

+0

爲什麼最後一位數字是'0'? '5'是'5'的倍數,二進制是'101'。 '105'也是'5'的倍數,它是二進制的'1101001'。 – sharptooth 2012-01-27 14:16:36

回答

5

這是代碼如何處理一些示例。

if ((n&1) == 1) //Checks if the number is odd 
    n <<= 1; //Multiplies the number by 2 if odd 

x = ((int)(x * 0.1) //Divides the number 10 then truncates any decimal places 
    * 10) //Multiplies it back by 10 

if ((int)x == n) //If the floating point value equals the (semi) original value its divisible by 5 
     return true; 

return false; //Other wise false 

例子:

15 & 1 == 1 //15 is odd 
15 <<= 1; //n is now 30 

30/10 = 3; 
3 * 10 = 30; //x is now 30 

30 == 30 //15 is a multiple of 5 

17 & 1 == 1 //17 is odd 
17 <<= 1; //n is now 34 

34/10 = 3.4; 
((int)3.4 = 3) * 10 = 30; //x is now 30 

30 != 34 //17 is not a multiple of 5. 

正如其他人說,雖然只是簡單地使用Mod運算符%

3

多試試這個

bool isMultipleof5(int n) 
{ 
    return (n%5) == 0; 
} 
+2

'return'不是一個函數,不需要外括號。 – unwind 2012-01-27 14:20:18

+0

只有(n%5)的部分在禁忌之內。 – Gregor 2012-01-27 14:31:51

8

它第一次n divisable由2

接下來,它會檢查其是否可以用0.1乘以10再除以10。這個想法,如果它可以被10整除,你會回到原來的,只有這樣。

因此,如果修改n是divisable 10 - 這肯定是由5 divisable爲好,因爲改性n總是divisable 2,如果是divisable通過5這將是divisable 10,並且該算法作品。

注意:這是非常unsuggested,尤其是可能打破大值由於浮點精度的問題。使用%操作人員應者優先:return (n % 5) == 0

+1

對於大於或等於'16777225'(浮點數基本上沒有足夠的位數)的IEEE754'float',它會中斷。 – 2012-01-27 14:23:23

+1

@amit,只有人回答這個問題,而不是建議另一種方式。從我+1。 – 2012-01-27 14:27:10

+0

還應該注意的是,浮點轉換是不必要的。除以10作爲整數會截斷該值。當然,如果他們避免模數,他們可能會試圖避免所有的整數除法。或者,如果編譯器正在優化運行(n/10)* 10 – 2012-01-27 14:35:16

2

一個更簡單的方法是

bool isMultipleof5(int n) 
{ 
    return 0 == (n % 5) ; 
} 
+2

您的解決方案中有6條線路太多... – 2012-01-27 14:21:52

+1

有很多可讀的代碼 – SlimCheney 2014-02-22 10:06:16

0
#define IS_MULTIPLE_OF_5(n) (((n)%5) ? 0 : 1) 
+0

您不需要三元運營商要做到這一點。 – 2012-01-27 14:24:03

+0

正確。你也不需要預處理器。或(布爾)函數。在使用測試的情況下是一個條件(==幾乎所有情況下),無論如何,結果將被優化(給定函數內聯) – wildplasser 2012-01-27 15:29:12

3

這是它如何工作的:

  1. 數量的兩倍。現在以5結尾的任何東西都可以被整除10(也可以被5整除)。 n <<= 1;(檢查奇怪是不必要的(n&1) == 1
  2. 將它除以10,並丟棄小數部分。 (int)(x*0.1)
  3. 乘以10,所以現在我們有相同的數量,在步驟1中,僅如果在步驟1中的數目已經整除10.

使用浮點到除以10使這算法危險,對於大數值可能不正確。

0

我同意(n%5)== 0將是一個理想的解決方案,但這不是真正的問題。

此代碼的工作原理是首先檢查輸入是否爲奇數。如果是,則乘以2。因爲所有奇數倍數的5結尾都是5,所以乘以2會得到一個以0結尾的數字。

然後檢查最後一位數字是否爲0.只有當它開始爲0(即偶數,我們沒有改變它),或者它是奇怪的,並以5結尾(我們乘以2)。因此,如果它以0結尾,則輸入必須已被5整除。

我想補充一點,這也是檢查最後一位數值的一種尷尬方法。我會建議n%10 == 0,但是像其他人提到的那樣...你可以在第一個地方使用n%5 == 0;)。