2016-07-08 2 views
2

Я пытаюсь создать программу для получения квадратного корня ввода и ближайшего простого ввода. Я не могу понять, что может быть проблемой при получении ближайшего премьер, но он не возвращает правильный ответ.C# - получить квадратный корень и ближайший простой

using System; 

namespace SqrtPrime 
{ 
class SqrtPrime 
{ 
    static void Main(string[] args) 
    { 

     int num, ctr; 
     Console.Write("Enter number: "); 
     num = int.Parse(Console.ReadLine()); 
     int[] inp = new int[num]; 

     for (ctr = 0; ctr < num; ctr++) 
     { 
      Console.Write("\n\nEnter number {0}: ", ctr + 1); 
      inp[ctr] = int.Parse(Console.ReadLine()); 
      double sqrt = Math.Sqrt(inp[ctr]); 
      Console.Write("\nSquare root: {0} ", sqrt); 
      int cnvt = inp[ctr]; 

      Console.Write("\nNearest prime number/s: "); 
      int i, Prime1 = 0, Prime2 = 0; 
      bool checkPrime1 = true, checkPrime2 = true; 

      while (checkPrime1) 
      { 
       cnvt--; 
       for (i = 2; i <= cnvt; i++) 
       { 
        if (cnvt % i == 0) 
        { 
         break; 
        } 
       } 
       if (i == cnvt) 
       { 
        checkPrime1 = false; 
        Prime1 = cnvt; 
        break; 
       } 
      } 

      while (checkPrime2) 
      { 
       cnvt++; 
       for (i = 2; i <= cnvt; i++) 
       { 
        if (cnvt % i == 0) 
        { 
         break; 
        } 
       } 
       if (i == cnvt) 
       { 
        Prime2 = cnvt; 
        checkPrime2 = false; 
        break; 
       } 
      } 

      if (Prime2 - cnvt > cnvt - Prime1) 
      { 
       Console.WriteLine(Prime1); 
      } 

      else if (Prime2 - cnvt < cnvt - Prime1) 
      { 
       Console.WriteLine(Prime2); 
      } 

      else if (Prime2 - cnvt == cnvt - Prime1) 
      { 
       Console.WriteLine(Prime1 + ", " + Prime2); 
      } 
     } 

     Console.ReadLine(); 
    } 
} 
} 
+0

Примечание стороны: я предлагаю * извлекая метод *, 'открытого статическая BOOL IsPrime (целое значение)' –

+0

я могу иметь какой-либо пример для этого одного пожалуйста? :) –

ответ

5

Предлагаю добывающие методы, первый IsPrime

public static bool IsPrime(int value) { 
    if (value <= 1) 
    return false; 
    else if (value % 2 == 0) 
    return value == 2; 

    int n = (int) (Math.Sqrt(value) + 0.5); 

    for (int i = 3; i <= n; i += 2) 
    if (value % i == 0) 
     return false; 

    return true; 
} 

Тогда primeBelow и primeAbove

private static int primeBelow(double value) { 
    int n = (int) value; 

    for (int i = n; i >= 2; --i) 
    if (IsPrime(i)) 
     return i; 

    return -1; // technical value, e.g. there's no prime below for sqrt(3) 
} 

private static int primeAbove(double value) { 
    int n = (int) value; 

    for (int i = n; ; ++i) 
    if (IsPrime(i) && (i > value)) 
     return i; 

    return -1; 
} 

, наконец, NearestPrime

private static string NearestPrime(double value) { 
    int below = primeBelow(value); 
    int above = primeAbove(value); 

    if (below < 0) 
    return above.ToString(); 

    if (Math.Abs(value - below) < Math.Abs(value - above)) 
    return below.ToString(); 
    else if (Math.Abs(value - below) > Math.Abs(value - above)) 
    return above.ToString(); 
    else 
    return string.Format("{0}, {1}", below, above); 
} 

затем использовать их

... 
    double sqrt = Math.Sqrt(inp[ctr]); 
    Console.Write("\nSquare root: {0} ", sqrt); 
    Console.WriteLine(NearestPrime(sqrt)); 
+0

это настоящая логика !!!!! #FAN – Dandy

+0

Одна нота, IsPrime - довольно неэффективная реализация, вы можете захотеть взглянуть на вещи, подобные [Sieve of Eratosthenes] (https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes), чтобы получить гораздо более быстрые способы построения список простых чисел. Кроме того, создайте список один раз и кешируйте его. –

+2

@Scott Чемберлен: вы совершенно правы, реализация не самая быстрая, но ИМХО, самая простая (хотя и достаточно хорошая). Использование предварительно вычисляемых «простых чисел» HashSet является хорошей идеей, но моя цель состояла в том, чтобы показать метод: поэтапная реализация вместо того, чтобы кодировать весь код в один единственный файл 'Main' –

0

Как было предложено, вы должны поставить некоторые из вашей логики в вспомогательных методах, вот простое решение на получение квадратного корня из числа и следующего и последнего простого числа.

class SqrtPrime 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Enter number: "); 
      int number = int.Parse(Console.ReadLine()); 

      Console.WriteLine("Square Root is: " + Math.Sqrt(number) + "\n"); 
      Console.WriteLine("Next Prime is " + CheckPrimeUpwards(number) + "\n"); 
      Console.WriteLine("Last Prime was " + CheckPrimeDownwards(number) + "\n"); 

      Console.ReadLine(); 
     } 

     static int CheckPrimeDownwards(int number) 
     { 
      int result = number; 

      while(!IsNumberAPrime(result)) 
      { 
       result--; 
      } 

      return result; 
     } 

     static int CheckPrimeUpwards(int number) 
     { 
      int result = number; 

      while (!IsNumberAPrime(result)) 
      { 
       result++; 
      } 

      return result; 
     } 

     public static bool IsNumberAPrime(int number) 
     { 
      int boundary = (int)Math.Floor(Math.Sqrt(number)); 

      if (number < 2) 
      { 
       return false; 
      } 

      if (number == 2) 
      { 
       return true; 
      } 

      for (int i = 2; i <= boundary; ++i) 
      { 
       if (number % i == 0) 
       { 
        return false; 
       } 
      } 

      return true; 
     } 
    } 
+0

Counter для' IsNumberAPrime': '-1 ',' 0' –

Смежные вопросы