5次检查的倍数

时间:2012-01-27 14:14:03

标签: c++ c algorithm

此代码如何适用于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;
}

7 个答案:

答案 0 :(得分:8)

首先使n除以2。

接下来,它会通过乘以0.1并再次使用10来检查它是否可以除以10。如果它可以被10分割,那么你将会回到原版,然后才会这样。

因此,如果修改n可以除以10 - 它当然也可以除以5,并且因为修改后的n总是可以除以2,如果可以除以5,它将是可以除以10,算法可以工作。

注意:由于浮点精度问题,这是非常未提及的,特别是可能会破坏大值。应优先使用%运算符:return (n % 5) == 0

答案 1 :(得分: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运算符%

答案 2 :(得分:3)

试试这个

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

答案 3 :(得分:3)

这是它的工作原理:

  1. 加倍数字。现在以5结尾的任何内容都将被整除10(并且也可以被5整除)。 n <<= 1;(奇怪的检查是不必要的(n&1) == 1
  2. 除以10,然后抛弃小数部分。 (int)(x*0.1)
  3. 将它乘以10,所以现在我们只有步骤1中的数字已被10整除时,我们才有与步骤1中相同的数字。
  4. 使用浮点除以10会使此算法变得危险,并且对于较大的值可能不正确。

答案 4 :(得分:2)

更简单的方法是

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我同意(n%5)== 0将是一个理想的解决方案,但这不是真正的问题。

此代码有效,因为它首先检查输入是否为奇数。如果是,则乘以2。由于5的所有奇数倍数以5结尾,因此乘以2得到以0结尾的数字。

然后检查最后一位是否为0.只有当它以0开始(即偶数,我们没有改变它)或者它是奇数并以5结尾时(我们乘以2) )。因此,如果它以0结尾,则输入必须可被5整除。

我补充一点,这也是检查最后一位数值的尴尬方法。我建议n%10 == 0,但是像其他提到的那样......你可能刚刚使用了n%5 == 0;)。