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!

```
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... going to 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 78
```

Obviously 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,000
```

But 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,000
```

you 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.