I found this question,
write a function that returns a square of given integer n without using multiplication.
Solution to this is
public static int sq(int n){
int i = n;
int sq = 0;
int count = 0;
while(i > 0){
if((i & 1) == 1){
sq += n << count;
}
i = i >> 1;
count++;
}
return sq;
}
I understand what the function is doing, but I don't understand why this is working.
Can anyone explain why this is a working solution?
Step 1: Add the last digit of the number you are trying to square to the entire number itself, creating your sum. Step 2: Multiply the sum (step 1) by the first digit of the base number. Step 3: Square the last digit of the base number.
Because multiplication distributes over addition. This probably sounds mysterious, but that really is the reason. Consider this multiplication:
100 * 111
Obviously that just 111 shifted left by two: 11100
This code is doing that for every bit that is 1 in i
, and summing the results. So it turns for example 111 * 111
into
001 * 111 = 00111
010 * 111 = 01110
100 * 111 = 11100
----- +
110001
Splitting the multiplication this way is allowed because multiplication distributes over addition, that is what makes 001 * 111 + 010 * 111 + 100 * 111
equal to (001 + 010 + 100) * 111
, and now it is obviously equal to 111 * 111
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With