Треугольники из простых чисел и геометрические последовательности: оптимизировать код - C#

Узнай цену своей работы

Формулировка задачи:

Let S(n) = a+b+c over all triples (a,b,c) such that: a, b, and c are prime numbers. a < b < c < n. a+1, b+1, and c+1 form a geometric sequence. For example, S(100) = 1035 with the following triples: (2, 5, 11), (2, 11, 47), (5, 11, 23), (5, 17, 53), (7, 11, 17), (7, 23, 71), (11, 23, 47), (17, 23, 31), (17, 41, 97), (31, 47, 71), (71, 83, 97) Find S(108). Допустим S(n) = a+b+c для все треугольников таких как: a, b, и c простые числа. a < b < c < n. a+1, b+1, и c+1 образуют геометрическую прогрессию. Например, S(100) = 1035 со следующими треугольниками: (2, 5, 11), (2, 11, 47), (5, 11, 23), (5, 17, 53), (7, 11, 17), (7, 23, 71), (11, 23, 47), (17, 23, 31), (17, 41, 97), (31, 47, 71), (71, 83, 97) Найти S(108). Источник: https://projecteuler.net/problem=518 Вообщето не очень сложно, но из-за того что число большое у меня считает годами)), пробовал распаролелить, но вылетает аут оф мемори. А если мало потоков делать, то всёравно долго. что у меня есть: метод првоерки на простоту числа:
Листинг программы
  1. private static bool IsPrime(int number)
  2. {
  3. if (number == 0)
  4. return false;
  5. if (number == 1)
  6. return false;
  7. if (number == 2)
  8. return true;
  9. if (number % 2 == 0) return false;
  10. var border = Math.Sqrt(number);
  11. for (int i = 3; i <= border; i+=2)
  12. {
  13. if (number%i == 0) return false;
  14. }
  15. return true;
  16. }
нахождение всех простых чисел
Листинг программы
  1. var n = 100000000;
  2. var threadsCount = 1000;
  3. long sum = 0;
  4. var primeValues = new List<int>();
  5. var threadInterval = n/threadsCount;
  6. var threads = new List<Thread>();
  7. object locker = new object();
  8. for (int i = 0; i < threadsCount; i++)
  9. {
  10. var thread = new Thread(_ =>
  11. {
  12. var jStart = threadInterval*i;
  13. var jEnd = threadInterval*(i + 1);
  14. for (int j = jStart; j < jEnd; j++)
  15. {
  16. if (IsPrime(j))
  17. {
  18. lock (locker)
  19. {
  20. primeValues.Add(j);
  21. }
  22. }
  23. }
  24. });
  25. threads.Add(thread);
  26. thread.Start();
  27. }
  28. foreach (var thread in threads)
  29. {
  30. thread.Join();
  31. }
ну и поиск нужных элементов
Листинг программы
  1. for (int i = 0; i < primeValues.Count; i++)
  2. {
  3. for (int j = 0; j < primeValues.Count; j++)
  4. {
  5. for (int k = 0; k < primeValues.Count; k++)
  6. {
  7. var a = primeValues[i];
  8. var b = primeValues[j];
  9. var c = primeValues[k];
  10. if (a*a + b*b == c*c)
  11. {
  12. if ((b + 1)%(a + 1) == (c + 1)%(b + 1))
  13. {
  14. sum += a + b + c;
  15. }
  16. }
  17. }
  18. }
  19. }
Подскажите, подкиньте идейку, ка крешить эту хадачу, чтобы хотябы за сутки посчитало, а не за n лет

Решение задачи: «Треугольники из простых чисел и геометрические последовательности: оптимизировать код»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5.  
  6. namespace ConsoleApplication1 {
  7.     class Program {
  8.         static void Main() {
  9.             //Console.WriteLine("введите число");
  10.             //var inp = int.Parse(Console.ReadLine());
  11.             var inp = (int)Math.Pow(10, 2);
  12.             var sw = new Stopwatch();
  13.             sw.Start();
  14.             var primeValues = new List<int>(inp / 10);
  15.             bool[] a = PrimeNumber(inp);
  16.             for (int i = 2; i < inp; i++) {
  17.                 if (a[i])
  18.                     primeValues.Add(i);
  19.             }
  20.             sw.Stop();
  21.             //foreach (var t in n)
  22.             //    Console.WriteLine(t);
  23.             Console.WriteLine(primeValues.Count);
  24.             Console.WriteLine("Затрачено секунд {0}", (double)sw.ElapsedMilliseconds / 1000);
  25.  
  26.             Console.WriteLine("начало поиска треугольников");
  27.             sw.Reset();
  28.             sw.Start();
  29.             Console.WriteLine();
  30.             Console.WriteLine(primeValues.Count);
  31.             //foreach (point p in AA(primeValues))
  32.             //    Console.WriteLine("({0},{1},{2})", p.a, p.b, p.c);
  33.             Console.WriteLine(Aa(primeValues));
  34.             sw.Stop();
  35.             Console.WriteLine("Затрачено секунд {0}", (double)sw.ElapsedMilliseconds / 1000);
  36.             Console.ReadLine();
  37.         }
  38.  
  39.         private static bool[] PrimeNumber(int number) {
  40.             var a = new bool[number];
  41.             for (int i = 2; i < number; i++) {
  42.                 a[i] = true;
  43.             }
  44.             for (int i = 2; i < Math.Sqrt(number) + 1; ++i) {
  45.                 if (a[i]) {
  46.                     for (int j = i * i; j < number; j += i) {
  47.                         a[j] = false;
  48.                     }
  49.                 }
  50.             }
  51.             return a;
  52.         }
  53.         /*
  54.         struct point {
  55.             public int a;
  56.             public int b;
  57.             public int c;
  58.             public point(int a, int b, int c)
  59.                 : this() {
  60.                 this.a = a;
  61.                 this.b = b;
  62.                 this.c = c;
  63.             }
  64.         }*/
  65.  
  66.         private static double a;
  67.         private static int a1;
  68.         private static long sum = 0;
  69.  
  70.         static /*IEnumerable<point>*/ long Aa(List<int> val) {
  71.             long min = val.Min();
  72.             var jj = new int[val.Count];
  73.             val.CopyTo(jj);
  74.             var val1 = jj.ToList();
  75.             var ss = new Stopwatch();
  76.             ss.Start();
  77.             for (int i = val.Count-1; i >0; i--) {
  78.                 Writetext(String.Format("{0} осталось - предыдущий завершен за {1} секунд", i + 1, (float)ss.ElapsedMilliseconds / 1000));
  79.                 ss.Restart();
  80.                 for (int j = i -1; j >=0; j--) {
  81.                     a = N(val[i] + 1, val[j] + 1);
  82.                     if (a < 2){
  83.                         break;
  84.                     }
  85.                     if (a%1!= 0)
  86.                         continue;
  87.                     a1 = (int)a;
  88.                     if (val.Contains(a1)) {
  89.                         sum += val[i] + val[j] + a1;
  90.                         //yield return new point(val[i], val[j], a1);
  91.                     }
  92.                 }
  93.                 val1.Remove(val[i]);
  94.             }
  95.             return sum;
  96.         }
  97.  
  98.         private const int Line = 5;
  99.  
  100.         private static void Writetext(string i){
  101.             Console.SetCursorPosition(0, Line);
  102.             Console.WriteLine("                                                                     ");
  103.             Console.SetCursorPosition(0, Line);
  104.             Console.WriteLine(i);
  105.         }
  106.  
  107.         private static double _t;
  108.         /// <summary>
  109.         ///
  110.         /// </summary>
  111.         /// <param name="i">C</param>
  112.         /// <param name="j">B</param>
  113.         /// <returns></returns>
  114.         static double N(double i, double j){
  115.             _t = (j*j/i) - 1;
  116.             return _t;
  117.         }
  118.     }
  119. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы