Member 13956126 Ответов: 3

Как написать код для поиска простых чисел между двумя числами


это моя проблема
этой программы нет
performance


Что я уже пробовал:

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

namespace the_prime_number_between_a_anb_b
{
    class Program
    {
        static void Main()
        {
            int num, i, a, b;
            Console.Write("Find the prime numbers within a range of numbers:");
            Console.Write("Input starting number of range: ");
            a = Convert.ToInt32(Console.ReadLine());
            Console.Write("Input ending number of range : ");
            b = Convert.ToInt32(Console.ReadLine());
            Console.Write("The prime numbers between {0} and {1} are : \n", a, b);

            for (num = a; num <= b; num++)
                for (i = 2; i <= num / 2; i++)
                {
                    if (num % i == 0)
                    {
                        break;
                    }
                } }

                if (num % i != 0)
                    {
                    Console.Write("{0}",num);
                    
            }
            
        }
    }
}

3 Ответов

Рейтинг:
2

OriginalGriff

Начните с того, что ваш код будет компилироваться - этого не произойдет, потому что фигурные скобки находятся в неправильном месте, помещая часть вашего кода за пределы main метод.

И нет, эта программа не является "производительностью" - потому что вы повторяете потенциально огромный диапазон чисел снова и снова: вы проверяете, является ли каждое число в диапазоне от 2 до 1 000 000 простым, затем вы проверяете, является ли каждое число в диапазоне от 2 до 1 000 001 простым, затем вы проверяете, является ли каждое число в диапазоне от 2 до 1 000 002 простым, затем вы проверяете ...

Это поразительно расточительно.
Вместо того, чтобы делать это, вычислите все простые числа в диапазоне один раз и сохраните их. Затем распечатайте их все.

- Я? У меня возникло бы искушение постоянно хранить их: записывать простые числа в файл и считывать его обратно при загрузке приложения - если диапазон находится внутри диапазона файлов, то вам больше не нужно работать, просто распечатайте. Если это не так, то создайте новые простые числа и добавьте их в файл для следующего раза. После нескольких запусков вашему приложению, вероятно, не нужно будет вычислять простые числа для большинства проверок...


Рейтинг:
1

Richard MacCutchan

Вы должны установить флаг в начале вашего внутреннего цикла, чтобы указать, что число является простым числом. Тогда как раз перед вашим break заявление установить его false чтобы указать, что он не является простым. Затем вы можете распечатать номер после завершения цикла, если флаг все еще установлен на true.


Рейтинг:
1

Patrice T

Цитата:
это моя проблема
эта программа не производительность

Нет, твоя проблема в том, что эта программа ошибочна и ничего не печатает!
Если ваша реальная программа напечатала правильный результат, то вы допустили ошибку при копировании его сюда.
Цитата:
эта программа не производительность

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

Откуда вы знаете, что вам нужно прекратить проверку потенциальных факторов ?
вы останавливаетесь на num/2, в чем причина ?
Когда вы вручную проверяете коэффициенты 101, вы останавливаетесь на 50 или останавливаетесь раньше ?
Если вы остановитесь на 50, потому что 51*2 больше, чем num, вы должны воспользоваться тем, что вы уже знаете, что 2 уже проверено и не является фактором 101, ни 3 ...
Когда вы поймете это и внесете необходимые изменения, производительность будет лучше, но все еще далека от оптимальной.

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