90 lines
2.3 KiB
C#
90 lines
2.3 KiB
C#
using System;
|
||
|
||
namespace RosettaVampireNumber
|
||
{
|
||
class Program
|
||
{
|
||
static void Main(string[] args)
|
||
{
|
||
int i, j, n;
|
||
ulong x;
|
||
var f = new ulong[16];
|
||
var bigs = new ulong[] { 16758243290880UL, 24959017348650UL, 14593825548650UL, 0 };
|
||
ulong[] tens = new ulong[20];
|
||
tens[0] = 1;
|
||
for (i = 1; i < 20; i++)
|
||
tens[i] = tens[i - 1] * 10;
|
||
|
||
for (x = 1, n = 0; n < 25; x++)
|
||
{
|
||
if ((j = fangs(x, f, tens)) == 0) continue;
|
||
Console.Write(++n + ": ");
|
||
show_fangs(x, f, j);
|
||
}
|
||
|
||
Console.WriteLine();
|
||
for (i = 0; bigs[i] > 0 ; i++)
|
||
{
|
||
if ((j = fangs(bigs[i], f, tens)) > 0)
|
||
show_fangs(bigs[i], f, j);
|
||
else
|
||
Console.WriteLine(bigs[i] + " is not vampiric.");
|
||
}
|
||
Console.ReadLine();
|
||
}
|
||
|
||
private static void show_fangs(ulong x, ulong[] f, int cnt)
|
||
{
|
||
Console.Write(x);
|
||
int i;
|
||
for (i = 0; i < cnt; i++)
|
||
Console.Write(" = " + f[i] + " * " + (x / f[i]));
|
||
Console.WriteLine();
|
||
}
|
||
|
||
private static int fangs(ulong x, ulong[] f, ulong[] tens)
|
||
{
|
||
int n = 0;
|
||
int nd = ndigits(x);
|
||
if ((nd & 1) > 0) return 0;
|
||
nd /= 2;
|
||
|
||
ulong lo, hi;
|
||
lo = Math.Max(tens[nd - 1], (x + tens[nd] - 2) / (tens[nd] - 1));
|
||
hi = Math.Min(x / lo, (ulong) Math.Sqrt(x));
|
||
|
||
ulong a, b, t = dtally(x);
|
||
for (a = lo; a <= hi; a++)
|
||
{
|
||
b = x / a;
|
||
if (a * b == x && ((a % 10) > 0 || (b % 10) > 0) && t == dtally(a) + dtally(b))
|
||
f[n++] = a;
|
||
}
|
||
|
||
return n;
|
||
}
|
||
|
||
private static ulong dtally(ulong x)
|
||
{
|
||
ulong t = 0;
|
||
while (x > 0)
|
||
{
|
||
t += 1UL << (int)((x % 10) * 6);
|
||
x /= 10;
|
||
}
|
||
|
||
return t;
|
||
}
|
||
|
||
private static int ndigits(ulong x)
|
||
{
|
||
int n = 0;
|
||
while (x > 0)
|
||
{
|
||
n++;
|
||
x /= 10;
|
||
}
|
||
return n;
|
||
}
|
||
}
|
||
}
|