# function to compute whether a binary number is divisible by 5
# it processes the bits left to right and keeps track of the remainder modulo 5
# for each bit b:
# remainder = (remainder * 2 + b) % 5
def is_divisible_by_five(bin)
# remainder modulo 5 while scanning bits
remainder = 0
# scan each bit of the binary number
bin.each_char do |bit|
# convert '0' or '1' to integer 0 or 1
b = bit.ord - '0'.ord
# update remainder using modulo arithmetic
remainder = (remainder * 2 + b) % 5
end
# divisible if final remainder is zero
remainder == 0
end
# read an n-bit binary number as a string
bin = "01000110" # 70
divisible = is_divisible_by_five(bin)
puts "Binary number: #{bin}"
puts "Divisible by 5: #{divisible ? 'yes' : 'no'}"
=begin
Example walk-through for bin = 01000110:
Start: remainder = 0
bit = 0 → remainder = (0*2 + 0) % 5 = 0
bit = 1 → remainder = (0*2 + 1) % 5 = 1
bit = 0 → remainder = (1*2 + 0) % 5 = 2
bit = 0 → remainder = (2*2 + 0) % 5 = 4
bit = 0 → remainder = (4*2 + 0) % 5 = 3
bit = 1 → remainder = (3*2 + 1) % 5 = 2
bit = 1 → remainder = (2*2 + 1) % 5 = 0
bit = 0 → remainder = (0*2 + 0) % 5 = 0
Final remainder = 0 → divisible by 5
=end
=begin
run:
Binary number: 01000110
Divisible by 5: yes
=end