kaprekar_numbers.sf 489 B

1234567891011121314151617181920212223242526
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Kaprekar_numbers
  4. #
  5. var kap = Hash()
  6. var nt = frequire('ntheory')
  7. for n in (1..15) {
  8. var np = (10**n - 1)
  9. nt.fordivisors({ |d|
  10. var dp = np//d
  11. if (gcd(d, dp) == 1) {
  12. kap{ dp == 1 ? d : d*invmod(d, dp) } := 0 ++
  13. }
  14. }, np)
  15. }
  16. var nums = kap.keys.map{ Num(_) }.sort
  17. for n in (6 .. 14) {
  18. var np = (10**n - 1)
  19. printf("Kaprekar numbers <= 10^%2d: %5d\n", n, nums.count_by { _ <= np })
  20. }