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===


More than ten times faster (same output):
Alternative version, right to left, produces same output
<lang d>import std.stdio, std.algorithm, std.range;


pure nothrow bool isKaprekar(in long n)
<lang d>bool isKaprekar(in long n) {
ulong a = n * n, b = a % 10;
in {
assert(n > 0, "isKaprekar(n) is defined for n > 0.");
for (ulong d = 1, t = 0; a > 0; d *= 10) {
b += t * d;
assert(n <= 3_162_277_660UL, "isKaprekar(n) overflow.");
a /= 10;
} body {
immutable ulong nn = n * n;
if (b && a + b == n)
ulong tens = 1;
return 1;
while (tens < nn)
t = a % 10;
tens *= 10;
}
return 0;

while ((tens /= 10) > n)
if (nn - n == (nn / tens) * (tens - 1))
return true;

return n == 1;
}

void main() {
writeln(filter!isKaprekar(iota(1, 10_000)));
writeln(count!isKaprekar(iota(1, 1_000_000)));
}</lang>
}</lang>