Kaprekar numbers: Difference between revisions
Content added Content deleted
(Improved second D version) |
(→{{header|D}}: no need to remove a valid approach with a C translation) |
||
Line 174: | Line 174: | ||
<pre>[1, 9, 45, 55, 99, 297, 703, 999, 2223, 2728, 4879, 4950, 5050, 5292, 7272, 7777, 9999] |
<pre>[1, 9, 45, 55, 99, 297, 703, 999, 2223, 2728, 4879, 4950, 5050, 5292, 7272, 7777, 9999] |
||
54</pre> |
54</pre> |
||
===Lower level version=== |
|||
Alternative version, right to left, produces same output |
|||
<lang d>import std.stdio, std.algorithm, std.range; |
|||
<lang d>bool isKaprekar(in long n) { |
|||
ulong a = n * n, b = a % 10; |
|||
in { |
|||
for (ulong d = 1, t = 0; a > 0; d *= 10) { |
|||
⚫ | |||
assert(n <= 3_162_277_660UL, "isKaprekar(n) overflow."); |
|||
a /= 10; |
|||
} body { |
|||
if (b && a + b == n) |
|||
return 1; |
|||
t = a % 10; |
|||
} |
|||
⚫ | |||
while ((tens /= 10) > n) |
|||
if (nn - n == (nn / tens) * (tens - 1)) |
|||
⚫ | |||
⚫ | |||
} |
|||
void main() { |
|||
writeln(filter!isKaprekar(iota(1, 10_000))); |
|||
writeln(count!isKaprekar(iota(1, 1_000_000))); |
|||
}</lang> |
}</lang> |
||