Programming Questions

Logic Behind Division Stringified - Ruby

What's the logic behind the condition: if (i + 1) % 3 == 0 ? Been seeing it in most solutions but I still can't see the logic behind it. I was able to answer this one with gsub but I wanted to understand this approach for future reference. Thanks!
Link to user's solution.

def DivisionStringified(n1,n2) n = (n1.to_f/n2.to_f).round arr = n.to_s.split("").reverse return "#{n.to_s}" if arr.length <= 3 n_with_commas = [] arr.each_with_index do |digit,i| n_with_commas << digit if (i + 1) % 3 == 0 n_with_commas << "," end end n_with_commas.reverse.join("") end # keep this function call here puts DivisionStringified(STDIN.gets)

krissasantos
posted this question on 7/15/16 **|**

2

they messed up my formatting... guna repost with code tags and see if it works.
First of all his solution is wrong. It will add a comma at the beginning of any number with a length multiple of 3.
e.g. ,100,000,000 or ,100,000 totally wrong....
But i'll explain the ( i + 1 ) % 3 == 0 anyways.
So the tricky part about this question is that you need to place a comma every 3 numbers from the end of the number. So you reverse the number and pop in a comma every three places.

Number: 100,000,000 or 10,000,000 Reversed Number: 000,000,001 000,000,01 Index: 012 345 678 012 345 67 Index + 1: 123 456 789 123 456 78Obviously you need to loop through, but how do you place a comma every 3 numbers. If you add 1 to the loop-index of the number you can use the modulo operator to check if you have iterated 3 times. Notice the above shitty matrix. Normally your index is zero-based. But if you add 1, you can now check for multiples of 3. This will execute the if statement every three places.

Number (reversed): 000 000 01 Index + 1: 123 456 78 (i+1)%3 == 0 executes: | | Result: 000,000,01 Reverse and return: 10,000,000But yeah his solution is wrong because it will add a comma at the end if the length is a multiple of 3.

Number (reversed): 000 000 001 Index + 1: 123 456 789 (i+1)%3 == 0 executes | | | Result: 000,000,001, Reverse and return: ,100,000,000you could fix this by adding a conditional

If ( i + 1 ) % 3 == 0 && ( i + 1 ) < reversedArray.length

zander312

answered on 07/16/16

Log in to write an answer.