Self numbers: Difference between revisions

added C# version, translation of Pascal, but stripped down.
(Add oeis link; fix wp link)
(added C# version, translation of Pascal, but stripped down.)
Line 13:
;*[[wp:Self_number|Wikipedia: Self numbers]]
 
=={{header|C#|CSharp}}==
{{trans|Pascal}} Stripped down, as C# limits the size of an array to Int32.MaxValue, so the sieve isn't large enough to hit the 1,000,000,000th value.
<lang csharp>using System;
using static System.Console;
 
class Program {
 
const int mc = 103 * 1000 * 10000 + 11 * 9 + 1;
 
static bool[] sv = new bool[mc + 1];
 
static void sieve() { int[] dS = new int[10000];
for (int a = 9, i = 9999; a >= 0; a--)
for (int b = 9; b >= 0; b--)
for (int c = 9, s = a + b; c >= 0; c--)
for (int d = 9, t = s + c; d >= 0; d--)
dS[i--] = t + d;
for (int a = 0, n = 0; a < 103; a++)
for (int b = 0, d = dS[a]; b < 1000; b++, n += 10000)
for (int c = 0, s = d + dS[b] + n; c < 10000; c++)
sv[dS[c] + s++] = true; }
 
static void Main() { DateTime st = DateTime.Now; sieve();
WriteLine("Sieving took {0}s", (DateTime.Now - st).TotalSeconds);
WriteLine("\nThe first 50 self numbers are:");
for (int i = 0, count = 0; count <= 50; i++) if (!sv[i]) {
count++; if (count <= 50) Write("{0} ", i);
else WriteLine("\n\n Index Self number"); }
for (int i = 0, limit = 1, count = 0; i < mc; i++)
if (!sv[i]) if (++count == limit) {
WriteLine("{0,12:n0}   {1,13:n0}", count, i);
if (limit == 1e9) break; limit *= 10; }
WriteLine("\nOverall took {0}s", (DateTime.Now - st). TotalSeconds);
}
}</lang>
{{out}}
<pre>Sieving took 3.4266187s
 
The first 50 self numbers are:
1 3 5 7 9 20 31 42 53 64 75 86 97 108 110 121 132 143 154 165 176 187 198 209 211 222 233 244 255 266 277 288 299 310 312 323 334 345 356 367 378 389 400 411 413 424 435 446 457 468
 
Index Self number
1   1
10   64
100   973
1,000   10,188
10,000   102,225
100,000   1,022,675
1,000,000   10,227,221
10,000,000   102,272,662
100,000,000   1,022,727,208
 
Overall took 7.0237244s</pre>
 
=={{header|F_Sharp|F#}}==