Saturday, September 10, 2011

Check if a number is multiple of 5 without using / and % operators (float <-> int trick)

Source

Given a positive number n, write a function isMultipleof5(int n) that returns true if n is multiple of 5, otherwise false. You are not allowed to use % and / operators.

Method 1 (Repeatedly subtract 5 from n)
Run a loop and subtract 5 from n in the loop while n is greater than 0. After the loop terminates, check whether n is 0. If n becomes 0 then n is multiple of 5, otherwise not.

#include
/* assumes that n is a positive integer */
bool isMultipleof5 (int n)
{
while ( n > 0 )
n = n - 5;
if ( n == 0 )
return true;
return false;
}
/* Driver program to test above function */
int main()
{
int n = 19;
if ( isMultipleof5(n) == true )
printf("%d is multiple of 5\n", n);
else
printf("%d is not a multiple of 5\n", n);
return 0;
}

Method 2 (Convert to string and check the last character)
Convert n to a string and check the last character of the string. If the last character is ’5′ or ’0′ then n is multiple of 5, otherwise not.

#include
#include
#include
/* Assuming that integre takes 4 bytes, there can
be maximum 10 digits in a integer */
# define MAX 11
bool isMultipleof5(int n)
{
char str[MAX];
itoa(n, str, MAX);
int len = strlen(str);
/* Check the last character of string */
if ( str[len-1] == '5' || str[len-1] == '0' )
return true;
return false;
}
/* Driver program to test above function */
int main()
{
int n = 19;
if ( isMultipleof5(n) == true )
printf("%d is multiple of 5\n", n);
else
printf("%d is not a multiple of 5\n", n);
return 0;
}

Thanks to Baban_Rathore for suggesting this method.

Method 3 (Set last digit as 0 and use floating point trick)
A number n can be a mulpile of 5 in two cases. When last digit of n is 5 or 10. If last bit in binary equivalent of n is set (which can be the case when last digit is 5) then we multiply by 2 using n<<=1 to make sure that if the number is multpile of 5 then we have the last digit as 0. Once we do that, our work is to just check if the last digit is 0 or not, which we can do using float and integer comparison trick.

#include
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;
}
/* Driver program to test above function */
int main()
{
int i = 19;
if ( isMultipleof5(i) == true )
printf("%d is multiple of 5\n", i);
else
printf("%d is not a multiple of 5\n", i);
getchar();
return 0;
}