Odin SolutionsOdin Solutions
✂️
Kaprekar Numbers
Week 45, 2026
All SolutionsSplit iterate and check | greenya | Odin Solutions
package main
import "core:fmt"
import "core:strconv"
main :: proc () {
for i in 1..=1_000_000 do check(i)
}
check :: proc (num: int) {
num_sq := num * num
it := split_iterate(num_sq)
for l, r in split_next(&it) {
if num!=l+r || l==0 || r==0 do continue
fmt.printfln("%d (%d): %d + %d", num, num_sq, l, r)
}
}
Split_Iterator :: struct {
buf: [100] byte,
str: string,
pos: int,
}
split_iterate :: proc (num: int) -> (it: Split_Iterator) {
it.str = fmt.bprint(it.buf[:], num)
return
}
split_next :: proc (it: ^Split_Iterator) -> (l, r: int, ok: bool) {
i := it.pos + 1
if i >= len(it.str) do return
l, _ = strconv.parse_int(string(it.buf[:i]))
r, _ = strconv.parse_int(string(it.buf[i:]))
it.pos += 1
return l, r, true
}