Программа простых чисел - PullRequest
       49

Программа простых чисел

2 голосов
/ 02 февраля 2009

В настоящее время я пробую ответить на несколько вопросов, чтобы попрактиковаться в своих навыках программирования. (Пока не брал его в школу или что-то еще, самоучка) Я столкнулся с этой проблемой, которая требовала, чтобы я прочитал число из заданного текстового файла. Это число будет равно N. Теперь я предполагаю найти N-е простое число для N <= 10 000. После того, как я его найду, я предполагаю распечатать его в другой текстовый файл. Теперь для большинства частей вопроса я могу понять и разработать метод получения N. Проблема в том, что я использую массив для сохранения ранее найденных простых чисел, чтобы использовать их для проверки будущих чисел. Даже когда мой массив был размером 100, при условии, что входное целое число было примерно <15, программа зависала. </p>

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;

int main() {
    ifstream trial;
    trial.open("C:\\Users\\User\\Documents\\trial.txt");
    int prime;
    trial >> prime;
    ofstream write;
    write.open("C:\\Users\\User\\Documents\\answer.txt");
    int num[100], b, c, e;
    bool check;
    b = 0;
    switch (prime) {
        case 1:
        {
            write << 2 << endl;
            break;
        }
        case 2:
        {
            write << 3 << endl;
            break;
        }
        case 3:
        {
            write << 5 << endl;
            break;
        }
        case 4:
        {
            write << 7 << endl;
            break;
        }
        default:
        {
            for (int a = 10; a <= 1000000; a++) {
                check = false;
                if (((a % 2) != 0) && ((a % 3) != 0) && ((a % 5) != 0) && ((a % 7) != 0)) // first filter
                {
                    for (int d = 0; d <= b; d++) {
                        c = num[d];
                        if ((a % c) == 0) {
                            check = true; // second filter based on previous recorded primes in array
                            break;
                        }

                    }
                    if (!check) {
                        e = a;
                        if (b <= 100) {
                            num[b] = a;
                        }

                        b = b + 1;
                    }
                }
                if ((b) == (prime - 4)) {
                    write << e << endl;
                    break;
                }
            }
        }
    }
    trial.close();
    write.close();
    return 0;
}

Я сделал это полностью, основываясь на своем руководстве по манекенам и сам, поэтому прощаю некоторую неэффективность кода и общее новшество моего алгоритма. Также до 15 он правильно отображает простые числа.

Может кто-нибудь сказать мне, как мне следует улучшить этот текущий код? Я думаю об использовании TXT-файла вместо массива. Это возможно? Любая помощь приветствуется.

Ответы [ 14 ]

0 голосов
/ 02 февраля 2009

Запустив ваш код через отладчик, я обнаружил, что он вылетает с исключением с плавающей запятой на "if ((a % c) == 0)". Причина этого в том, что вы ничего не инициализировали в num, поэтому вы делаете «% 0».

0 голосов
/ 02 февраля 2009

Похоже, что при обходе основного цикла for () значение b увеличивается.

Затем это приводит к сбою, потому что вы обращаетесь к памяти из конца вашего массива:

                for (int d = 0; d <= b; d++) {
                    c = num[d];

Я думаю, вам нужно прояснить алгоритм, а затем снова подойти к коду.

0 голосов
/ 02 февраля 2009

Например, у вас было бы меньше кода (что всегда хорошо!), Если бы у вас не было особых случаев для 3, 5 и 7.

Кроме того, вы можете избежать специального случая для 2, если вы просто установите num [b] = 2 и будете проверять делимость только на вещи в вашем массиве.

0 голосов
/ 02 февраля 2009

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

...