2015-08-14 3 views
-2

Я нашел простые числа от 2 до 100, например. Мне нужно знать, какой номер находится на позиции, скажем, 24. Можете ли вы помочь мне найти самый простой способ сделать это?C# как найти номер позиции в диапазоне

using System; 
using System.Collections.Generic; 

class SomePrimesRange 
{ 
    static void Main() 
    { 

     for (int i = 2; i < 260; i++) 
     { 
      if (i % 2 == 0) 
      { 

      } 
      else if (i % i == 0) 
      { 
       Console.WriteLine(i); 
      } 
      List<int> numbers = new List<int>(260); 
      numbers.Add(i); 
      foreach (int a in numbers) 
      { 
       Console.WriteLine("Enter a position:"); 
       int position = int.Parse(Console.ReadLine()); 
       Console.WriteLine(position); 
      } 
     } 
    } 
} 
+1

'Можете ли вы помочь мне найти самый простой способ сделать это'? Конечно, просто покажите свой трудный путь, чтобы мы могли работать над этим. – Eser

+0

Привет! Я попытался сделать что-то вроде этого: [http://pastebin.com/LPER5CNq] это мой трудный путь :( –

ответ

0

Во-первых, я предполагаю, что вы не хотите, простое решение, дело, которое было бы перебором, и приведет к медленному неоптимизированном кода.

Я не собираюсь писать для вас код, но я объясню теорию этого и даю вам некоторый псевдокод.

func findPrimeNumber(int n){ 
    primeArray = [] 
    int number = 1 

    while(primeArray.length < n){ 
    if(isNumberPrime(number) == true){ 
     primeArray.append(number, primeArray) 
    } 
    number++ 
    } 
} 

func isNumberPrime(int number, int[] primeArray){ 
    var minCheck = Math.roundUp(Math.sqrt(number)) 
    foreach prime in primeArray{ 
    if(prime <= minCheck && prime > 1){ 
    if(number % prime != 0){ 
     //keep checking numbers 
    }else{ 
     return false 
    } 
    }else{ 
     break; //no more checking is necessary 
    } 
    return true; 
    } 
} 

Я реализовал две основные концепции в вышеуказанном псевдокоде (возможно, вам придется улучшить код для краевых случаев).

Выполнение алгоритма, который определяет, является ли число простым простым путем проверки из 2 ... n-1, является неэффективным и расточительным.

  1. Вам нужно всего лишь проверить номера до квадратного корня вашего номера, с которым вы столкнулись. Например, чтобы определить, является ли 16 простым, вам нужно только проверить, являются ли 2, 3, 4 простым. (ответ да в виде 2 и 4).

Как насчет 17? 2,3,4,5 не являются делимыми и 17 - простое.

  1. Вам нужно всего лишь проверить основные факторы. Нет никакого смысла проверять, является ли число простым, деля его на непустые числа, так как каждое не-простое состоит из простых чисел в конечном счете. Таким образом, вам нужно только проверить основные факторы, которые меньше квадратного корня.

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

Дайте мне знать, если вам нужна дополнительная помощь. Удачи, забавная маленькая проблема.

+0

@John Thompson Это помогло? – Unome

0

Сделайте петлю foreach. Добавьте числа в список. Затем получите 24-й элемент в массиве. Пункт [23] (не вещь [24], так как массив начинается с 0]

Это код для этого:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace PrimeNumberHelp 
{ 
    class Program 
    { 

     private static int Max = 100; 
     static void Main(string[] args) 
     { 
      List<int> Primes = new List<int>(); 
      int current = 0; 
      while (current <= 100) 
      { 
       if (IsPrime(current)) 
        Primes.Add(current); 
       current++; 
      } 
      Console.WriteLine(Primes[23]); 
      Console.ReadKey(); 
     } 

     private static bool IsPrime(int number) 
     { 
      if (number == 1) 
       return false; 
      if (number == 2) 
       return true; 

      if (number % 2 == 0) 
       return false; 

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

Я делаю это действительно неправильно. Можете ли вы мне немного помочь? Я новичок в C#, и я подумал, что что-то вроде этого будет делать: [http://pastebin.com/LPER5CNq] , но нет :( –

+0

@TsenkoAleksiev Помог ли это? Если это так, выберите это как ответ. –

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