コード例 #1
0
        public double GetLongestConsecutivePrimeSum(int upto)
        {
            var primes           = _eSieve.GetPrimes(upto).ToArray();
            var maxSequence      = 0;
            int maxSequencePrime = 0;

            // http://www.mathblog.dk/project-euler-50-sum-consecutive-primes/
            var primeSums = GetPrimeSums(primes);

            for (int i = 0; i < primes.Length - 1; i++)
            {
                for (int j = 2; j <= primes.Length; j++)
                {
                    int sum = primeSums[j] - primeSums[i];
                    if (sum > upto)
                    {
                        break;
                    }

                    int rangeCount = j - i;
                    if (maxSequence < rangeCount &&
                        Array.BinarySearch(primes, sum) >= 0)
                    {
                        maxSequence      = rangeCount;
                        maxSequencePrime = sum;
                    }
                }
            }

            return(maxSequencePrime);
        }
コード例 #2
0
 public void Run()
 {
     foreach (int prime in eSieve.GetPrimes(56003))
     {
         int length = DigitsCount(prime);
     }
 }
コード例 #3
0
 public string Run()
 {
     foreach (int prime in sieve.GetPrimes(1487))
     {
         int prime2 = prime + STEP;
         int prime3 = prime + 2 * STEP;
         if (sieve.IsPrime(prime2) && sieve.IsPrime(prime3))
         {
             List <int> digits1 = GetDigits(prime).ToList();
             digits1.Sort();
             List <int> digits2 = GetDigits(prime2).ToList();
             digits2.Sort();
             List <int> digits3 = GetDigits(prime3).ToList();
             digits3.Sort();
             bool isDesiredNumber = true;
             for (int i = 0; i < digits1.Count; ++i)
             {
                 if (digits1[i] != digits2[i] || digits2[i] != digits3[i] || digits1[i] != digits3[i])
                 {
                     isDesiredNumber = false;
                     break;
                 }
             }
             if (isDesiredNumber)
             {
                 return(prime.ToString() + prime2.ToString() + prime3.ToString());
             }
         }
     }
     return(string.Empty);
 }
コード例 #4
0
        public int Run(int maxNumber)
        {
            ESieve eSieve = new ESieve(maxNumber);

            int[]  primes   = eSieve.GetPrimes().ToArray();
            long[] primeSum = CalculateSums(primes).ToArray();

            int maxLength    = -1;
            int desiredPrime = -1;
            int i            = 0;

            while (i < primeSum.Length)
            {
                for (int j = i - (maxLength + 1); j >= 0; --j)
                {
                    if (primeSum[i] - primeSum[j] > maxNumber)
                    {
                        break;
                    }

                    int sugestedPrime = (int)(primeSum[i] - primeSum[j]);
                    if (Array.BinarySearch(primes, sugestedPrime) > -1)
                    {
                        maxLength    = i - j;
                        desiredPrime = sugestedPrime;
                    }
                }
                i++;
            }
            return(desiredPrime);
        }
コード例 #5
0
 public int Run()
 {
     foreach (int prime in sieve.GetPrimes())
     {
         if (_checkedPrimes.Contains(prime))
         {
             continue;
         }
         CheckCircularPrime(prime);
     }
     return(_circularPrimes.Count());
 }
コード例 #6
0
        public int Run()
        {
            int minSum = int.MaxValue;

            foreach (int firstPrime in eSieve.GetPrimes())
            {
                if (firstPrime * 5 > minSum)
                {
                    break;
                }

                foreach (int secondPrime in eSieve.GetPrimes(firstPrime))
                {
                    if (firstPrime + secondPrime * 4 > minSum)
                    {
                        break;
                    }

                    if (!MakePrimes(firstPrime, secondPrime))
                    {
                        continue;
                    }

                    foreach (int thirdPrime in eSieve.GetPrimes(secondPrime))
                    {
                        if (firstPrime + secondPrime + thirdPrime * 3 > minSum)
                        {
                            break;
                        }

                        if (!MakePrimes(thirdPrime, secondPrime) || !MakePrimes(thirdPrime, firstPrime))
                        {
                            continue;
                        }

                        foreach (int fourthPrime in eSieve.GetPrimes(thirdPrime))
                        {
                            if (firstPrime + secondPrime + thirdPrime + fourthPrime * 2 > minSum)
                            {
                                break;
                            }

                            if (!MakePrimes(fourthPrime, thirdPrime) || !MakePrimes(fourthPrime, secondPrime) || !MakePrimes(fourthPrime, firstPrime))
                            {
                                continue;
                            }

                            foreach (int fifthPrime in eSieve.GetPrimes(fourthPrime))
                            {
                                if (firstPrime + secondPrime + thirdPrime + fourthPrime + fifthPrime > minSum)
                                {
                                    break;
                                }

                                if (!MakePrimes(fifthPrime, fourthPrime) || !MakePrimes(fifthPrime, thirdPrime) ||
                                    !MakePrimes(fifthPrime, secondPrime) || !MakePrimes(fifthPrime, firstPrime))
                                {
                                    continue;
                                }
                                int sum = firstPrime + secondPrime + thirdPrime + fourthPrime + fifthPrime;
                                if (minSum > sum)
                                {
                                    minSum = sum;
                                }
                            }
                        }
                    }
                }
            }
            return(minSum);
        }
コード例 #7
0
 public PrimeSummations()
 {
     _primeNumbers = _eSieve.GetPrimes(PRIME_COUNT).ToList();
 }
コード例 #8
0
        public void TestGeneratingPrimes(int upto, int[] expected)
        {
            int[] actual = _sut.GetPrimes(upto).ToArray();

            Assert.True(expected.SequenceEqual(actual));
        }