此代码如何适用于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;
}
答案 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)
这是它的工作原理:
n <<= 1;
(奇怪的检查是不必要的(n&1) == 1
)(int)(x*0.1)
使用浮点除以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;)。