Member 13095321 Ответов: 2

Диапазон простых чисел


это довольно простой вопрос, но я получаю ошибки при отправке
Вопрос:
Напишите функцию isPrime (n), которая выводит 1 или 0, если n является простым или нет, соответственно. Используйте эту функцию в программе, которая принимает начальное целое число (s) и конечное целое число (e) в качестве входных данных и выводит 1 каждый раз, когда обнаруживается простое число, и 0 в противном случае включаются s и e. Ниже приведено несколько примеров.

./a.out "34" "40"
0 0 0 1 0 0 0				# only 37 as prime number

./a.out "4" "9"
0 1 0 1 0 0				# only 5 and 7 as prime numbers


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

#include<stdio.h>
#include<stdlib.h>

void isPrime(int n);
int main(int argc,char*argv[])
{
    int s,e;
    if(argc!=3) exit(1);
    s=atoi(argv[1]);
    e=atoi(argv[2]);
    int i;
    for(i=s;i<=e;i++)
{
    isPrime(i);
}
return 0;
}
void isPrime(int n)
{
    int i, flag = 0;

    for(i=2; i<=n; ++i)
    {
        // condition for nonprime number
        if(n%i==0)
        {
            flag=1;
            break;
        }
    }

    if (flag==0)
        printf("1");
    else
        printf("0");
}

jeron1

"получение ошибок при отправке" не могли бы вы быть более конкретными?

Member 13095321

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

Peter_in_2780

В чем ошибка(ы) вы получаете? Время компиляции? Время выполнения? Мы не сможем помочь решить вашу проблему, если вы не скажете нам, в чем она заключается.

Member 13095321

никаких ошибок во время компиляции.

Anthony Mushrow

Пробовали ли вы тестировать свою функцию isPrime локально перед отправкой? Или проверка выходных данных, когда вы отправляете свою программу (опять же, если ваш школьный портал сообщает вам, каковы были выходные данные).
Если я запускаю ваш код и передаю в программу "0" и "10", то получаю следующий результат:
1100000000

PIEBALDconsult

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

Кроме того, ваш учитель вряд ли будет впечатлен вашей реализацией.

Member 13095321

можете ли вы предложить лучшую реализацию?

PIEBALDconsult

Я могу.
Ищи ты сито Эратосфена.
Сделайте сито от 2 до e (предварительно заполните 0 и 1), затем проиндексируйте его, чтобы получить значения для s через e.

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
но я получаю ошибки при отправке

Какие сообщения об ошибках ?
Предполагая, что у вас есть компилятор C, вы должны научиться использовать отладчик, это невероятный инструмент.

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
0

Mehedi Shams

Привет Member 13095321,

В этой строке есть ошибка:

for(i=2; i<=n; ++i)
Так и должно быть,
for(i=2; i<n; ++i)
Также нет необходимости подбегать к n для проверки делимости. Половина этого числа в порядке. Скажем, n=37, тогда нет необходимости зацикливаться до 36, чтобы проверить делимость; зацикливание до n / 2 = 18 было бы прекрасно, как и более поздние числа (19, 20,....) не являются факторами 36.

Существуют и другие эффективные подходы к поиску простых чисел. Вы тоже можете попробовать.


PIEBALDconsult

На самом деле нет необходимости выходить за пределы квадратного корня.

Mehedi Shams

Хорошо, спасибо за поправку :)