Guest User

Problem14 Euler with multithreading

a guest
Jan 3rd, 2015
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.49 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Threading;
  5.  
  6. namespace Problem14
  7. {
  8.     class Program
  9.     {
  10.         static List<int> list = new List<int>();
  11.         static void Main(string[] args)
  12.         {
  13.             Stopwatch sw = Stopwatch.StartNew();
  14.             int startNumber = 1000000;
  15.  
  16.             List<NumberFounder> listOfNumberFounders = new List<NumberFounder>();
  17.             for (int i = 0; i < Environment.ProcessorCount; i++)
  18.             {
  19.                 listOfNumberFounders.Add(new NumberFounder(startNumber));
  20.                 startNumber--;
  21.             }
  22.  
  23.             List<Thread> ThreadsList = new List<Thread>();
  24.             foreach (NumberFounder item in listOfNumberFounders)
  25.             {
  26.                 ThreadsList.Add(new Thread(item.FoundNumber));
  27.             }
  28.  
  29.             foreach (Thread thread in ThreadsList)
  30.             {
  31.                 thread.Start();
  32.             }
  33.  
  34.             foreach (Thread thread in ThreadsList)
  35.             {
  36.                 thread.Join();
  37.             }
  38.  
  39.  
  40.             sw.Stop();
  41.             Console.WriteLine("The answer is: " + NumberFounder.answerNumber);
  42.             Console.WriteLine("Result was found in: " + sw.ElapsedMilliseconds + " ms.");
  43.             Console.Read();
  44.         }
  45.  
  46.     }
  47.    
  48.  
  49.     public class NumberFounder
  50.     {
  51.         public static int answerNumber;
  52.         public static long answerTerms;
  53.         int startNumber;
  54.         public NumberFounder(int startNumber)
  55.         {
  56.             this.startNumber = startNumber;
  57.         }
  58.  
  59.         public void FoundNumber()
  60.         {
  61.             int maxTerms = 0;
  62.             int anserw = 0;
  63.             for (int i = startNumber; i > 500000; i = i - Environment.ProcessorCount)
  64.             {
  65.                 int terms = CalculateTerms(i);
  66.                 if (terms > maxTerms)
  67.                 {
  68.                     maxTerms = terms;
  69.                     anserw = i;
  70.                 }
  71.             }
  72.             if (maxTerms > answerTerms)
  73.             {
  74.                 answerTerms = maxTerms;
  75.                 answerNumber = anserw;
  76.             }
  77.         }
  78.  
  79.         int CalculateTerms(long number)
  80.         {
  81.             long oryginal = number;
  82.             int terms = 1;
  83.             while (number > 1)
  84.             {
  85.                 if (number % 2 == 0) number = number / 2;
  86.                 else number = 3 * number + 1;
  87.                 terms++;
  88.             }
  89.             return terms;
  90.         }
  91.     }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment