Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
90
Task/Vampire-number/C-sharp/vampire-number.cs
Normal file
90
Task/Vampire-number/C-sharp/vampire-number.cs
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue