コード例 #1
0
ファイル: Problems1To10.cs プロジェクト: joe90p/ProjectEuler
        public long Problem3()
        {
            long        number = 600851475143;
            List <long> primes = new List <long>();

            for (long i = 2; i <= Math.Pow(number, 0.5); i++)
            {
                if (number % i == 0)
                {
                    long otherDivisor = number / i;
                    if (MathsHelper.IsPrime(i))
                    {
                        primes.Add(i);
                    }
                    else
                    {
                        if (MathsHelper.IsPrime(otherDivisor))
                        {
                            return(otherDivisor);
                        }
                    }
                }
            }

            primes.Reverse();

            return(primes[0]);
        }
コード例 #2
0
        public static bool IsPalindrome(int pal)
        {
            int  factor        = 0;
            int  maxPower      = 7;
            bool palindromeSet = false;

            int[] palindrome = new int[1];
            int   j          = 0;

            for (int i = maxPower; i >= 0; i--)
            {
                factor = (pal / MathsHelper.Power(10, i));
                if (!palindromeSet && factor > 0)
                {
                    palindromeSet = true;
                    palindrome    = new int[i + 1];
                }
                if (palindromeSet)
                {
                    palindrome[j] = factor;
                    j++;
                }
                pal = pal - (factor * MathsHelper.Power(10, i));
            }
            return(IsPalindrome(palindrome));
        }
コード例 #3
0
        public void Problem27()
        {
            Dictionary <long, bool> isPrimeDict = new Dictionary <long, bool>();
            long maxConsecutive = 0;
            Tuple <long, long> coeffs;

            for (long a = -500; a < 500; a++)
            {
                long aValue = (2 * a) + 1;
                for (long b = -500; b < 500; b++)
                {
                    long bValue = (2 * b) + 1;
                    //bool resultPrime = true;
                    while (true)
                    {
                        long quadValue = this.GetQuadraticValue(aValue, bValue, 0);
                        if (!isPrimeDict.ContainsKey(quadValue))
                        {
                            bool isPrime = MathsHelper.IsPrime(quadValue);
                            isPrimeDict.Add(quadValue, isPrime);
                        }
                        if (isPrimeDict[quadValue])
                        {
                            maxConsecutive++;
                            coeffs = Tuple.Create(aValue, bValue);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
        }
コード例 #4
0
ファイル: Problems1To10.cs プロジェクト: joe90p/ProjectEuler
        public int Problem9()
        {
            int s      = 1000;
            int mlimit = (int)Math.Sqrt(s / 2);
            var range  = Enumerable.Range(2, mlimit - 2);

            Func <int, Tuple <bool, int> > action = m =>
            {
                if ((s / 2) % m == 0)
                {
                    int k = m % 2 == 0 ? m + 1 : m + 2;
                    while (k < 2 * m && k <= s / (2 * m))
                    {
                        if (s / (2 * m) % k == 0 && MathsHelper.gcd(k, m) == 1)
                        {
                            int n = k - m;
                            int d = s / (2 * m * k);
                            return(Tuple.Create(true, MathsHelper.Power(d, 3) *
                                                ((m * m) - (n * n)) *
                                                (2 * m * n) *
                                                ((m * m) + (n * n))));
                        }
                        k += 2;
                    }
                }
                return(Tuple.Create(false, 0));
            };

            return(range.Select(action).First(x => x.Item1).Item2);
        }
コード例 #5
0
        //not mathematical
        public int Problem40Alternative()
        {
            var t       = Enumerable.Range(1, 1000000).SelectMany(x => x.ToString()).ToArray();
            var indexes = Enumerable.Range(0, 7).Select(x => MathsHelper.Power(10, x));

            return(indexes.Select(x => Int32.Parse(t[x - 1].ToString())).Product());
        }
コード例 #6
0
        public int PowerUp(IEnumerable <int> t)
        {
            int result = 0;

            foreach (int i in t)
            {
                result += MathsHelper.Power(2, i);
            }
            return(result);
        }
コード例 #7
0
ファイル: Problems21to30.cs プロジェクト: joe90p/ProjectEuler
 public void Problem23()
 {
     var range  = Enumerable.Range(1, 28123);
     var tuples = range.
                  Select(x => Tuple.Create(x, MathsHelper.GetFactors(x).Distinct().Sum())).
                  ToList();
     var abundents    = tuples.Where(x => x.Item2 > x.Item1).Select(x => x.Item1).Where(x => x <= 28123).Skip(1).ToList();
     var abundentSums = abundents.SelectMany(x => abundents, (x, y) => x + y).Distinct().Where(x => x <= 28123).OrderBy(x => x).ToList();
     int tot          = (28123 * 28124 / 2);
     int answer       = tot - abundentSums.Sum();
 }
コード例 #8
0
        public int Problem12()
        {
            int numberOfFactors = 0;
            int n        = 0;
            int triangle = 0;

            while (numberOfFactors < 500)
            {
                n++;
                triangle       += n;
                numberOfFactors = MathsHelper.NumberOfFactors(triangle);
            }

            return(triangle);
        }
コード例 #9
0
ファイル: Problems1To10.cs プロジェクト: joe90p/ProjectEuler
        public int TheNthPrimeIs(int whichNumerPrime)
        {
            int i            = 1;
            int numberToTest = 3;

            while (i < whichNumerPrime)
            {
                if (MathsHelper.IsPrime(numberToTest))
                {
                    i++;
                }
                numberToTest++;
            }
            return(numberToTest - 1);
        }
コード例 #10
0
 public IEnumerable <int> ProductSum(IEnumerable <int> l)
 {
     for (int i = 0; i < 9; i++)
     {
         for (int j = i + 1; j < 9; j++)
         {
             var num1 = MathsHelper.ConvertToDecimal(l.Take(i + 1));
             var num2 = MathsHelper.ConvertToDecimal(l.Where((x, ix) => (ix > i) && ix <= j));
             var eq   = MathsHelper.ConvertToDecimal(l.Skip(j + 1));
             if (num1 * num2 == eq)
             {
                 yield return(eq);
             }
         }
     }
 }
コード例 #11
0
        public void Problem43()
        {
            var list = this.GetPerms(0, 10).Select(x => new { Orig = x, Split = this.Split(x, 3) });
            var hmm  = list.
                       Select(x => new
            {
                x.Orig,
                Split = x.Split.Item2.
                        Aggregate(x.Split.Item1.ToEnumerable(), (y, i) => y.Concat(y.Last().Skip(1).Concat(i))).Skip(1)
            }
                              );
            var ooo         = hmm.Select(x => new { x.Orig, Nums = x.Split.Select(MathsHelper.ConvertToDecimal) });
            var primes      = MathsHelper.GetPrimesUpTo(17).ToList();
            var interesting = ooo.Where(x => x.Nums.Zip(primes, (a, b) => a % b).All(y => y == 0)).ToList();
            var thingy      = interesting.Select(x => x.Orig.Reverse().ToList()).ToList();


            var hello = BigNumberHelper.AddListRepresentingNumbers(thingy);
        }
コード例 #12
0
        private static IEnumerable <int> GetPerimetersOfPrimitivePythagoreanTriplets(int s)
        {
            //generate coprime m,n with exactly one m,n even
            int m      = 2;
            int n      = 1;
            int mlimit = (int)Math.Sqrt(s / 2);

            while (m <= mlimit)
            {
                n = m % 2 == 0 ? 1 : 2;
                while (n < m)
                {
                    if (MathsHelper.gcd(m, n) == 1)
                    {
                        yield return(2 * m * (m + n));
                    }
                    n += 2;
                }
                m++;
            }
        }
コード例 #13
0
        public int Problem37()
        {
            var truncatable = new Dictionary <int, IEnumerable <IEnumerable <int> > >();
            IEnumerable <IEnumerable <int> > choices = new int[][] { new int[] { 1 }, new int[] { 3 }, new int[] { 7 }, new int[] { 9 } };
            var tailElements = new HashSet <int>(new int[] { 3, 7 });
            //var primes = new HashSet<int>(GetPrimesUpTo(1000000000));

            //primes.

            Func <IEnumerable <int>, int> getNumber = list => list.Reverse().Select((i, j) => i * MathsHelper.Power(10, j)).Sum();
            Func <IEnumerable <int>, IEnumerable <IEnumerable <int> > > getRLSubsets = list => list.Select((i, j) => list.Skip(j));

            truncatable.Add(1, new int[][] { new int[] { 2 }, new int[] { 3 }, new int[] { 5 }, new int[] { 7 } });


            for (int q = 2; q < 20; q++)
            {
                truncatable[q]     = truncatable[q - 1].SelectMany(p => choices, (r, t) => r.Concat(t));
                truncatable[q]     = truncatable[q].Where(x => MathsHelper.IsPrime((long)getNumber(x))).ToList();
                truncatable[q - 1] = truncatable[q - 1].Where(x => getRLSubsets(x).Select(getNumber).All(y => MathsHelper.IsPrime((long)y)));
                if (truncatable[q - 1].Count() == 0)
                {
                    truncatable[q] = new List <IEnumerable <int> >();
                    break;
                }
            }

            var tyy = truncatable.Where(x => x.Key >= 2).Select(x => x.Value).Select(x => x.Select(getNumber)).SelectMany(x => x).Sum();


            IEnumerable <int> test = Enumerable.Range(1, 4);
            var hg = test.Select((i, j) => test.Skip(j));



            return(0);
        }
コード例 #14
0
        public int Problem40()
        {
            int x = 1000000;

            int mult     = 1;
            int start    = 9;
            int oldStart = start;

            while (x > start)
            {
                int thing = 9 * MathsHelper.Power(10, mult);
                mult++;
                oldStart = start;
                start    = start + (thing * mult);
            }

            int num   = x - oldStart - 1;
            int f     = MathsHelper.Power(10, mult - 1) + (num / mult);
            int index = num % mult;

            int answer = Int32.Parse(f.ToString()[index].ToString());

            return(answer);
        }
コード例 #15
0
        public int Problem41()
        {
            var primes = MathsHelper.GetPrimesUpTo(987654321);

            return(primes.Last(this.IsPandigital));
        }
コード例 #16
0
 public int Problem39()
 {
     return(MathsHelper.GetPythagTriplePerimeterCount(1000).
            OrderByDescending(x => x.Item2).
            First().Item1);
 }
コード例 #17
0
ファイル: Problems71to80.cs プロジェクト: joe90p/ProjectEuler
 public int Problem75()
 {
     return(MathsHelper.GetPythagTriplePerimeterCount(1500000).
            Count(x => x.Item2 == 1));
 }
コード例 #18
0
        public int Problem36()
        {
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();
            var binomialExpansionDictionary = GetBinomialExpansionLevelDictionary(10);
            Func <int, bool> valid          = i => i < 1000000 && IsPalindrome(i.ToString());
            int rollingTotal = 1;

            foreach (var kvp in binomialExpansionDictionary)
            {
                Func <int, int, IEnumerable <int> > g = ExpandPalindromicIndexEven;
                Func <int, int, IEnumerable <int> > h = ExpandPalindromicIndexOdd;
                var p = ApplyPartial(g, kvp.Key);
                var q = ApplyPartial(h, kvp.Key);
                foreach (var r in kvp.Value)
                {
                    IEnumerable <int> th = new int[] { Increase(r, p), Increase(r, q), Increase(r, q) + MathsHelper.Power(2, kvp.Key + 1) };
                    foreach (var x in th)
                    {
                        if (valid(x))
                        {
                            rollingTotal += x;
                        }
                    }
                }
            }
            sw.Stop();
            return(rollingTotal);
        }
コード例 #19
0
ファイル: Problems1To10.cs プロジェクト: joe90p/ProjectEuler
 public int Problem2()
 {
     return(MathsHelper.GetFibonacciSequenceUpTo(4000000).Where(x => x % 2 == 0).Sum());
 }
コード例 #20
0
 /// <summary>
 /// To get the upper limit we note that a number with n digits cannot have a digit factorial sum greater n * factorial(9).
 /// We can propose an upper limit of 10^7 (this is an n-digit number greater than n * factorial(9)).
 ///
 /// We can then show by induction that for all k > 10^7 that k > digitfacorialsum(k)
 ///
 /// Result is true for k = 10^7
 ///
 /// Assume true up to some k > 10^7
 ///
 /// we know digitfactorialsum(k+1) is less than n * factorial(9)
 ///
 /// Therefore k +1 > k > n * factorial(9) > digitfactorialsum(k+1)
 /// Therefore k+1 >  digitfactorialsum(k+1). QED.
 /// </summary>
 public void Problem34()
 {
     var answer = DigitSumEqual(MathsHelper.Power(10, 7), this.Factorial);
 }
コード例 #21
0
ファイル: Problems1To10.cs プロジェクト: joe90p/ProjectEuler
        public long Problem10()
        {
            Func <long, int, long> func = (l, i) => l + i;

            return(MathsHelper.GetPrimesUpTo(2000000).Aggregate(0, func));
        }
コード例 #22
0
 /// <summary>
 /// To get the upper limit see the comments for problem 34.
 /// </summary>
 public void Problem30()
 {
     var answer = DigitSumEqual(MathsHelper.Power(10, 6), x => MathsHelper.Power(x, 5));
 }