using System.Collections.Generic;
private static readonly Dictionary<int, long> Sums = new Dictionary<int, long> { { 0, 1 } };
private static readonly Dictionary<int, long> ResultSet = new Dictionary<int, long>();
private static readonly List<long> ValidPrimes = new List<long>();
public static void Main()
while (perfectNumber != 0)
Console.WriteLine("Which Perfect Number would you like me to find? (0 to exit):");
var input = Console.ReadLine();
if (input.Equals("0")) return;
while (!int.TryParse(input, out perfectNumber))
Console.WriteLine("Which Perfect Number would you like me to find? (0 to exit):");
input = Console.ReadLine();
Console.WriteLine("That would be: {0}", GetPerfectNumber(perfectNumber));
Console.WriteLine("Nice try buddy. How about 7 or less?");
private static long GetPerfectNumber(int sequenceNumber)
if (ResultSet.ContainsKey(sequenceNumber)) return ResultSet[sequenceNumber];
var pow = Sums.Last().Key + 1;
var lastPerfect = ResultSet.Any() ? ResultSet.Last().Key : 0;
var result = (long)Math.Pow(2, pow + 1) - 1;
ResultSet.Add(++lastPerfect, result * (long)Math.Pow(2, pow));
while (!ResultSet.ContainsKey(sequenceNumber));
return ResultSet[sequenceNumber];
private static bool IsPrime(long candidate)
if (ValidPrimes.Contains(candidate)) return true;
if ((candidate & 1) == 0)
ValidPrimes.Add(candidate);
for (int i = 3; (i * i) <= candidate; i += 2)
if ((candidate % i) == 0 || i * i < 0)
if(candidate != 1) ValidPrimes.Add(candidate);