2013-08-03 3 views
2

Я отказался от генератора чисел, потому что я понимаю, что он фактически делит каждое число, пока не получит простое число. Я изменил код так, что простые числа из заданного диапазона "a" to "?" (in this case, 10) в методе Prime_2 проверяются как простые в методе Prime. Тогда метод Prime возвращает, если это число является простым, задавая логическую переменную prime, true или false, но до сих пор я получил значение true для 2 и false для остальных. Это, очевидно, не так. Поэтому я был бы признателен за любую помощь/комментарии/предложения в том, чтобы сделать эту новую программу работоспособной.Prime Number Checker Написано на C#

public bool Prime(long num) // Prime method with a parameter for one number 
{ 
    int div = 3; // what we divide by after checking if the number is divisible by 2 
    bool prime = true; // set prime to true 
    { 
     for (long i = 0; i < 100 && prime == true; i++) // run 100 passes 
     { 
      if (num % 2 == 0 && num != 2) // if the number is divisible by 2 
      {        // and is not 2, prime is false. 
       prime = false; 
      } 
      else if (num % 2 != 0 && num != 2) // if the number is not divisible 
      {         // by 2 and the number is not 2... 
       for (long x = 0; x <= 1000; x++) // then run 1000 passes of this: 
       { 
        if (num % Math.Pow((div), x) == 0 && num != Math.Pow((div), x)) 
        { // if the number is divisible by our div to the power of x 
         // and the number is not equal to div to the power of x, 
         // prime is false. 
         prime = false; 
        } 
       } 
      } 
     else // otherwise add 2 to div making it the next consecutive odd number 
      { // and run the pass again 
       div = div + 2; 
      } 

     } 
     return prime; 
    } 
} 
public void Prime_2() // void Prime_2 method 
{ 
    long a = 2; // starting number 2 
    long b = 0; // set b 

    Program prg = new Program(); //new instance of the Program class 
    while (a <= 10)//the range a (2) - 10 
    { 
     b = a;//set "b" to "a" every time 
     prg.Prime(b); // run the Prime method for numbers 2-10 
     Console.WriteLine(b); // write the number being checked 
     Console.WriteLine(prg.Prime(b)); // return if it is true or false for prime 
     a++; // add 1 to a 
    } 
} 
static void Main(string[] args) 
{ 
    Program prog = new Program(); // instantiate a new Program 
    prog.Prime_2(); // run the method, Prime_2 
    Console.ReadLine(); // wait for input 
} 
+3

Вы действительно должны использовать 'yield return' ... –

+0

Вы изменяете число внутри вашей функции проверки. Похоже, вы пытаетесь найти простое число, которое меньше заданного числа. –

ответ

8

Если вы хотите, чтобы проверить каждое число от 2 до 100 для простоты путем пробного деления, что и вы, кажется, пытается сделать, использовать этот псевдокод алгоритм:

function isPrime(n) 
    if n % 2 == 0 
     return n == 2 
    d := 3 
    while d * d <= n 
     if n % d == 0 
      return False 
     d := d + 2 
    return True 

Это занимает много времени O (n 1.5) для нахождения простых чисел до n. Если вы хотите более быстрый алгоритм, с помощью решета Эратосфена, который O (п войти войти п):

function primes(n) 
    sieve := makeArray(2..n, True) 
    for p from 2 to n step 1 
     if sieve[p] 
      output p 
      for i from p*p to n step p 
       sieve[i] := False 

Если вы заинтересованы в программировании с простыми числами, я скромно рекомендую этот essay на мой блог.

+0

На самом деле, я должен был попытаться использовать вашу программу перед редактированием моей. Это именно то, что мне нужно. Спасибо. –

+0

@Orren: Не забудьте перейти по ссылке. На нескольких языках реализованы как «простые», так и «isPrime». – user448810

+0

Сделаю, еще раз спасибо. –

0

Я не уверен, почему вы делаете то, что делаете в своей функции. Не могли бы вы добавить комментарии в свой код? Однако быстрый способ проверить простое число будет следующим

bool IsPrime(int number) { 
    if (number % 2 == 0 && number != 2) return false; // Don't check even numbers 

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

Конечно, вы должны затем вызвать функцию выше в, если заявление и если верно, то отобразить номер.

+4

Чтобы иметь более быстрое решение, вы можете изменить свой цикл: int n = (int) (Math.Sqrt (number) + 1); for (int i = 3; i

+0

Он не пытается проверить, является ли число простым, он пытается исправить свой код, поэтому простое число в последовательности не генерируется случайным образом. –