Простые числа между двумя заданными целыми числами - PullRequest
1 голос
/ 16 мая 2019

Это мой код для поиска простых чисел между двумя целыми числами.Он компилируется нормально, но выдает ошибку времени выполнения SIGXFSZ на codechef.

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long n,m;
    int t;
    cin>>t;
    while(t--)
    {
        cin>>m>>n;
        for(long long j=m;j<=n;j++)
            for(long long i=2;i<=sqrt(j);i++)
                if(j%i==0)
                    break;
                else cout<<j<<"\n";
        cout<<"\n";
    }
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 16 мая 2019

Кажется, что вы ошибаетесь в логике.

Насколько я понимаю, вы должны печатать простые числа между двумя числами.

Но в вашем коде есть логические ошибки.

1) Код не считает 2 и 3 простыми числами.

Скажите, m = 1, n = 10. Для j = 2, 3 внутренний цикл не будет выполняться даже один раз. Следовательно, вывод не будет отображаться как пользователь.

2) else cout<<j<<"\n"; оператор размещен неправильно, так как это приведет к тому, что простые числа будут напечатаны несколько раз, а также некоторые составные числа.

Пример:

Для j = 11 этот код будет напечатан 11 дважды (for i = 2, 3).

Для j = 15 этот код будет напечатан 15 один раз (for i = 2), хотя это составное число.

0 голосов
/ 18 мая 2019

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

Логика вашего кода неверна и неполна.Если вы будете использовать скобки последовательно, это может быть ясно.Самый внутренний цикл должен давать сбой на не простом, но только его отказ break сигнализирует простое число, поэтому его не может быть, пока цикл не завершится.Место, где вы объявляете простое число, неверно.Чтобы правильно справиться с этой ситуацией, требуется некоторая переменная флага или другое исправление для эмуляции помеченных циклов:

int main() {
    int trials;

    cin >> trials;

    while (trials--)
    {
        long long start, stop;

        cin >> start >> stop;

        for (long long number = start; number <= stop; number++)
        {
            if (number < 2 || (number % 2 == 0 && number != 2))
            {
                continue;
            }

            bool prime = true;

            for (long long odd = 3; odd * odd <= number; odd += 2)
            {
                if (number % odd == 0)
                {
                    prime = false;
                    break;
                }
            }

            if (prime)
            {
                cout << number << "\n";
            }
        }
    }

    return 0;
}

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

0 голосов
/ 16 мая 2019

По сути, это «превышенный размер файла», что означает, что размер выходного файла превышает допустимый размер.

Пожалуйста, проверьте размер выходного файла вашей программы.

...