Humble numbers: Difference between revisions
Content added Content deleted
(Added PL/M) |
(Added Wren) |
||
Line 3,116: | Line 3,116: | ||
1272 have 8 digits |
1272 have 8 digits |
||
1767 have 9 digits</pre> |
1767 have 9 digits</pre> |
||
=={{header|Wren}}== |
|||
{{trans|Go}} |
|||
{{libheader|Wren-fmt}} |
|||
{{libheader|Wren-math}} |
|||
{{libheader|Wren-sort}} |
|||
Wren doesn't have arbitrary precision arithmetic and 'safe' integer operations are limited to a maximum absolute value of 2^53-1 (a 16 digit number). So there is no point in trying to generate humble numbers beyond that. |
|||
<lang ecmascript>import "/fmt" for Fmt |
|||
import "/math" for Int, Nums |
|||
import "/sort" for Find |
|||
var humble = Fn.new { |n| |
|||
var h = List.filled(n, 0) |
|||
h[0] = 1 |
|||
var next2 = 2 |
|||
var next3 = 3 |
|||
var next5 = 5 |
|||
var next7 = 7 |
|||
var i = 0 |
|||
var j = 0 |
|||
var k = 0 |
|||
var l = 0 |
|||
for (m in 1...n) { |
|||
h[m] = Nums.min([next2, next3, next5, next7]) |
|||
if (h[m] == next2) { |
|||
i = i + 1 |
|||
next2 = 2 * h[i] |
|||
} |
|||
if (h[m] == next3) { |
|||
j = j + 1 |
|||
next3 = 3 * h[j] |
|||
} |
|||
if (h[m] == next5) { |
|||
k = k + 1 |
|||
next5 = 5 * h[k] |
|||
} |
|||
if (h[m] == next7) { |
|||
l = l + 1 |
|||
next7 = 7 * h[l] |
|||
} |
|||
} |
|||
return h |
|||
} |
|||
var n = 43000 // say |
|||
var h = humble.call(n) |
|||
System.print("The first 50 humble numbers are:") |
|||
System.print(h[0..49]) |
|||
var f = Find.all(h, Int.maxSafe) // binary search |
|||
var maxUsed = f[0] ? f[2].min + 1 : f[2].min |
|||
var maxDigits = 16 // Int.maxSafe (2^53 -1) has 16 digits |
|||
var counts = List.filled(maxDigits + 1, 0) |
|||
var digits = 1 |
|||
var pow10 = 10 |
|||
for (i in 0...maxUsed) { |
|||
while (true) { |
|||
if (h[i] >= pow10) { |
|||
pow10 = pow10 * 10 |
|||
digits = digits + 1 |
|||
} else break |
|||
} |
|||
counts[digits] = counts[digits] + 1 |
|||
} |
|||
System.print("\nOf the first %(Fmt.dc(0, maxUsed)) humble numbers:") |
|||
for (i in 1..maxDigits) { |
|||
var s = (i != 1) ? "s" : "" |
|||
System.print("%(Fmt.dc(9, counts[i])) have %(Fmt.d(2, i)) digit%(s)") |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
The first 50 humble numbers are: |
|||
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 50, 54, 56, 60, 63, 64, 70, 72, 75, 80, 81, 84, 90, 96, 98, 100, 105, 108, 112, 120] |
|||
Of the first 42,037 humble numbers: |
|||
9 have 1 digit |
|||
36 have 2 digits |
|||
95 have 3 digits |
|||
197 have 4 digits |
|||
356 have 5 digits |
|||
579 have 6 digits |
|||
882 have 7 digits |
|||
1,272 have 8 digits |
|||
1,767 have 9 digits |
|||
2,381 have 10 digits |
|||
3,113 have 11 digits |
|||
3,984 have 12 digits |
|||
5,002 have 13 digits |
|||
6,187 have 14 digits |
|||
7,545 have 15 digits |
|||
8,632 have 16 digits |
|||
</pre> |
|||
=={{header|zkl}}== |
=={{header|zkl}}== |