Wednesday 29 April 2009

PROJECT EULER #77

Link to Project Euler problem 77

It is possible to write ten as the sum of primes in exactly five different ways:

7 + 3
5 + 5
5 + 3 + 2
3 + 3 + 2 + 2
2 + 2 + 2 + 2 + 2

What is the first value which can be written as the sum of primes in over five thousand different ways?

A modification of the previous algorithm


using System;
using System.Collections.Generic;

namespace ProjectEuler
{
class Program
{
static void Main()
{
//Problem 77
DateTime start = DateTime.Now;
var primes = GeneratePrimes(80);
int maxNumber = 80,target=0,sum=0;
int[,] a = new int[maxNumber + 1, maxNumber + 1];
for (int i = 0; i < maxNumber + 1; i++)
{
a[i, 0] = 0;
a[0, i] = 1;
}
int n = 2;
while (sum < 5000)
{
if (n%2 == 0) a[n, 1] = 1;
else a[n, 1] = 0;
for (int j = 2; j < primes.Count; j++)
{
int k = n - primes[j];
if (k < 0)
a[n, j] = a[n, j - 1];
else
a[n, j] = a[n, j - 1] + a[k, j];
if (a[n, j] > 5000)
{
target = n;
sum = a[n, j];
break;
}
}
n++;
}
Console.WriteLine(sum + " " +target);
TimeSpan time = DateTime.Now - start;
Console.WriteLine("This took {0}", time);
Console.ReadKey();
}
public static bool IsPrime(int n)
{
if (n < 2) return false;
if (n == 2) return true;
for (long i = 2; i <= Math.Sqrt(n); i++)
if (n % i == 0) return false;
return true;
}
public static List<int> GeneratePrimes(int n)
{
var primeNumbers = new List<int> { 0,2, 3 };
for (int i = 5; i <= n; i += 2)
if (IsPrime(i))
primeNumbers.Add(i);
return primeNumbers;
}
}
}

No comments: