What is the simplest way to calculate the amount of even numbers in a range of unsigned integers?
An example: if range is [0...4] then the answer is 3 (0,2,4)
I\
Hint 1: The modulo operator will return the remainder of the current number
Hint 2: You don't need a for loop
Hint 3: A range is continuous
Hint 4: The number of even numbers in a continuous range are half even (sometimes half + 1, sometimes half - 1)
Hint 5: Building on Hint1: Consider also what (being + end + 1) % 2 gives
Hint 6: Most or all of the answers in this thread are wrong
Hint 7: Make sure you try your solution with negative number ranges
Hint 8: Make sure you try your solution with ranges spanning both negative and positive numbers
int even = (0 == begin % 2) ? (end - begin) / 2 + 1 : (end - begin + 1) / 2;
Which can be converted into:
int even = (end - begin + (begin % 2)) / 2 + (1 - (begin % 2));
EDIT: This can further simplified into:
int even = (end - begin + 2 - (begin % 2)) / 2;
EDIT2: Because of the in my opinion somewhat incorrect definition of integer division in C (integer division truncates downwards for positive numbers and upwards for negative numbers) this formula won't work when begin is a negative odd number.
EDIT3: User 'iPhone beginner' correctly observes that if begin % 2
is replaced with begin & 1
this will work correctly for all ranges.
Answer is to use binary AND.
so a number is represented in memory in 0 and 1. lets say 4 and 5.
4 = 0000 0100
5 = 0000 0101
and every even number has a zero in the end and every odd number has 1 in the end;
in c '1' means true and '0' means false.
so: lets code;
function isEven(int num){
return ((num & 0x01) == 0) ? 1 : 0;
}
Here 0x01 means 0000 0001. so we are anding 0x01 with the given number.
imagine no is 5
5 |0000 0101
0x01 |0000 0001
---------------
0000 0001
so answer will be '1'.
imagine no is 4
4 |0000 0100
0x01 |0000 0001
---------------
0000 0000
so answer will be '0'.
now,
return ((num & 0x01) == 0) ? 1 : 0;
it is expanded in :
if((num & 0x01) == 0){// means the number is even
return 1;
}else{//means no is odd
return 0;
}
So this is all.
End is binary operatiors are very important in compititive programming world.
happy coding.
first answer here.
EDIT 1:
Total no of evens are
totalEvens = ((end - start) / 2 + ((((end - start) & 0x01 ) == 0) ? 0 : 1 ));
here
(end - start)/2
gives the half of total numbers.
this works if one is even and one is odd.
but,
((((end - start) & 0x01 ) == 0) ? 0 : 1 )
can just replaced by (!isEven(end-start))
So, if the total number is even then dont add 1 else add 1.
this completely works.
The range is always [2a+b, 2c+d] with b,d = {0,1}. Make a table:
b d | #even
0 0 | c-a+1
0 1 | c-a+1
1 0 | c-a
1 1 | c-a+1
Now a = min/2, b = min % 2, c = max/2 and d = max % 2.
So int nEven = max/2 - min/2 + 1 - (min%2)
.
In terms of start and length:
(length >> 1) + (1 & ~start & length)
half the length plus 1 if start is even and length is odd.
In terms of start and end:
((end - start + 1) >> 1) + (1 & ~start & ~end)
half the length plus 1 if start is even and end is even.
I'm a bit surprised that iteration was tried to solve this.
The minimum number of even numbers possible in a range is equal to half of the length of the array of numbers, or, rangeEnd - rangeStart.
Add 1 if the first or last number is even.
So the method is: (using javascript)
function evenInRange(rangeStart, rangeEnd)
{
return
Math.floor(rangeEnd - rangeStart) +
((rangeStart % 2 == 0) || (rangeEnd % 2 == 0) ? 1 : 0)
}
Tests:
0 1 2 3 4 5 6 7 8
8 - 0 = 8
8 / 2 = 4
4 + 1 = 5
Even numbers in range:
0 2 4 6 8
11 12 13 14 15 16 17 18 19 20
20 - 11 = 9
9 / 2 = 4
4 + 1 = 5
Even numbers in range
12 14 16 18 20
1 2 3
3 - 1 = 2
2 / 2 = 1
1 + 0 = 1
Even numbers in range
2
2 3 4 5
5 - 2 = 3
3 / 2 = 1
1 + 1 = 2
Even numbers in range
2 4
2 3 4 5 6
6 - 2 = 4
4 / 2 = 2
2 + 1 = 3
Even numbers in range
2 4 6