Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/64: Рейтинг темы: голосов - 64, средняя оценка - 4.84
0 / 0 / 1
Регистрация: 29.01.2015
Сообщений: 33

Найти первые 100 простых чисел

24.11.2017, 22:55. Показов 12834. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как найти первые 100 простых чисел?
Без использования массива.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2017, 22:55
Ответы с готовыми решениями:

Дано натуральное число N. Найти первые N простых чисел
Добрый день! Не могли бы подсказать, как можно реализовать следующую задачу с помощью указателей на языке С. Дано натуральное число N....

Найти 100 первых простых чисел
найти 100 первых простых чисел #include<stdio.h> #include<conio.h> #include<math.h> #define n 100 int main() { int...

Найти 100 первых простых чисел
1.Найти 100 первых простых чисел Нашел много примеров на С++ но вот разобраться в них,получается с трудом. Буду очень признателен...

17
2485 / 1149 / 709
Регистрация: 25.04.2016
Сообщений: 3,300
24.11.2017, 23:23
3 секунды в гугле, и находим: Еще раз о поиске простых чисел.

Теперь пишем:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
/* ***************************************************
 * Найти первые 100 простых чисел.
 * Число называется простым, если оно имеет ровно два
 * различных делителя: единицу и самого себя.
 * **************************************************/
int isprime (int n)
{
    if(n==1) // 1 - не простое число
        return 0;
    // перебираем возможные делители от 2 до sqrt(n):
    for(int d=2; d*d <= n; d++)
    {
        if(n%d==0) return 0;        // если разделилось нацело, то составное
    }
    return 1;   // если нет нетривиальных делителей, то простое
}
 
int main (void)
{
    for (int i=1; i<101; i++)
        if (isprime(i)) printf("%i\n", i);
    return 0;
}
Оно?

Добавлено через 4 минуты
Все подобные задачи были решены программистами еще лет 60 тому назад.
1
0 / 0 / 1
Регистрация: 29.01.2015
Сообщений: 33
24.11.2017, 23:30  [ТС]
Не совсем то, мне нужно сделать что бы что бы был только int main ()
0
2485 / 1149 / 709
Регистрация: 25.04.2016
Сообщений: 3,300
24.11.2017, 23:42
Ну так, это, вперед. Читаем код, видим, что вместо if (isprime(i)) должна стоять функция, которая выше, и думаем как же затолкать туда этот код? Неужто вот так?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
/* ***************************************************
 * Найти первые 100 простых чисел.
 * Число называется простым, если оно имеет ровно два
 * различных делителя: единицу и самого себя.
 * **************************************************/
int main (void)
{
    int answer = -1;
    for (int i=1; i<101; i++)
    {
        if (i == 1) answer= 0;
        for(int d=2; d*d <= i; d++) if (i%d == 0) { answer = 0; break; }
        if (answer < 0) answer = 1;
        if (answer) printf("%i\n", i);
        answer = -1;
    }
    return 0;
}
И сразу все такие безрукие... вы чем учитесь?
1
0 / 0 / 1
Регистрация: 29.01.2015
Сообщений: 33
24.11.2017, 23:49  [ТС]
Ваша программа ищет простые числа до 100, а нужно 100 первых простых чисел!
0
2485 / 1149 / 709
Регистрация: 25.04.2016
Сообщений: 3,300
24.11.2017, 23:50
Ну так опять же... вперед. Проявляем инициативу, вытаскиваем голову из песка и начинаем уже думать. Тем более, что уже все есть и разжевано.
3
0 / 0 / 1
Регистрация: 29.01.2015
Сообщений: 33
24.11.2017, 23:52  [ТС]
Спасибо за помощь)
0
2485 / 1149 / 709
Регистрация: 25.04.2016
Сообщений: 3,300
25.11.2017, 12:41
Лучший ответ Сообщение было отмечено Dron_4r как решение

Решение

Как бы я думал над этой задачей?

Cейчас цикл выполняет ровно 100 повторений, и находит при этом сколько-то ответов. Сколько именно ответов он находит, я не знаю. Значит, во-первых, мне нужно считать количество найденных ответов. Ну а чтобы что-нибудь посчитать, мне нужна еще одна переменная. Окей, назову ее counter.

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

Так, а что еще мне надо сделать?
Цикл должен работать не до тех пор, пока i<101, а до тех пор, пока counter<100. От оно как, вот в чем дело-то оказывается!

Ну, кажется все, что нужно, у меня уже есть, осталось только написать:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
/* ***************************************************
 * Найти первые 100 простых чисел.
 * Число называется простым, если оно имеет ровно два
 * различных делителя: единицу и самого себя.
 * **************************************************/
int main (void)
{
    int answer = -1;
    int counter = 0;
    for (int i=1; counter<100; i++)
    {
        if (i == 1) answer= 0;
        for(int d=2; d*d <= i; d++) if (i%d == 0) { answer = 0; break; }
        if (answer < 0) answer = 1;
        if (answer > 0) { printf("%i\n", i); counter++; }
        answer = -1;
    }
    return 0;
}
Добавлено через 44 минуты
Хоть программа и выглядит рабочей и даже что-то считает, делает она это довольно медленно. Например, любое четное число не будет простым, тем не менее, мы проверяем все четные числа. Значит, если исключить все четные, то программа уже будет выполнять меньше действий. Чтобы это сделать, достаточно заменить i++ на i+=2 в цикле.

Добавлено через 11 часов 29 минут
Однако, если мы просто заменим счетчик цикла на i+=2, наша программа будет работать с ошибкой. Почему? Потому, что число 2 тоже является простым, т.е. 2 делится на 1 и на саму себя, но наш цикл будет пропускать число 2.

Иными словами нам нужно изменить цикл так, чтобы он пропускал 1, считал 2 простым и при этом работал только с нечетными числами. Т.е. менять счетчик в цикле мы не можем, в смысле цикл должен начинаться с 1, счетчик должен быть i+=2, чтобы исключить все четные. Но нам нужно как-то добавить исключение для числа 2.

Для этого мы можем изменить сам цикл.

Если у нас i = 1, мы изменим его на 2 и дадим циклу его проверить, число пройдет проверку, counter изменится на 1 и все будет просто отлично. Но если мы после этого добавим еще одно условие, которое будет проверять i == 2 и будет менять i на 1, чтобы в конце первой итерации получить i = 1+2, мы добавим в цикл еще одно действие, плюс лишнюю проверку при i=2, т.е. на каждом шаге будет проводиться еще одна проверка условия, а нам это не нужно, поскольку цикл и без того выполняет лишние действия, поэтому мы немного подправим само условие при i == 1, например вот так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
/* ***************************************************
 * Найти первые 100 простых чисел.
 * Число называется простым, если оно имеет ровно два
 * различных делителя: единицу и самого себя.
 * **************************************************/
int main (void)
{
    int answer = -1;
    int counter = 0;
    for (int i=1; counter<100; i+=2)
    {
        if (i == 1) { answer = 0; printf("2\n"); counter++; }
        for(int d=2; d*d <= i; d++) if (i%d == 0) { answer = 0; break; }
        if (answer < 0) answer = 1;
        if (answer > 0) { printf("%i\n", i); counter++; }
        answer = -1;
    }
    return 0;
}
Вот теперь у нас все отлично и цикл работает как надо.
2
Диссидент
Эксперт C
 Аватар для Байт
27713 / 17331 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
25.11.2017, 13:22
Можно еще предложить такой вариант (тоже несложно для восприятия новичков)
C
1
2
3
4
5
6
int d = 1;
for (int i=2; counter<100; i+=d)
  {
        ...
       d = 2;
  }
Или даже такой (с "мерцающим" шагом")
C
1
2
3
4
5
6
7
8
9
int d = 1;
for (int i=2; counter<100; i+=d)
  {
        ...
       if (i > 6) {
         if (i%6==1) d = 4;
         else            d = 2;
      }
  }
Тут фишка в том, что шаг - тоже переменная.
1
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 51
29.11.2017, 20:43
Привет,вот в этом коде как можно добиться чтоб последнее выведенное простое число не имело после себя пробела? тоесть вывод примерно такой : 2 3 5 7 11 ........ 541(после 541 нет пробела и курсор останавливается сразу после 541) @stake-k26
0
Диссидент
Эксперт C
 Аватар для Байт
27713 / 17331 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
29.11.2017, 21:20
Цитата Сообщение от RedRaider Посмотреть сообщение
вот в этом коде
В каком?
Цитата Сообщение от RedRaider Посмотреть сообщение
не имело после себя пробела?
Совсем ничего не смыслите? В языке, в функции printf и ее форматах? Так и спросите.
0
2485 / 1149 / 709
Регистрация: 25.04.2016
Сообщений: 3,300
29.11.2017, 21:32
RedRaider, если необходимо вывести n простых чисел с начала, и n заранее известно, то смотреть не равен ли counter n-1, например:

C
1
2
3
4
5
if (answer > 0)
{
    printf("%i", i);    // выводим число
    if (++counter < n-1) printf(" ");    // повышаем counter на 1 и добавляем пробел, если нужно
}
Т.е. смотрим сколько чисел вывели и при необходимости добавляем после числа пробел.
0
29.11.2017, 21:38

Не по теме:

stake-k26, да, если мы уж взялись в этом участвовать, надо запастись мудростью и терпением.:)

0
2485 / 1149 / 709
Регистрация: 25.04.2016
Сообщений: 3,300
29.11.2017, 21:45
Другой вопрос зачем так извращаться? Терминалу все едино, есть пробел в конце или нет. Если записывать результат в строку, то после всех записей в строку, т.е. после цикла, можно просто стереть последний пробел. Займет куда меньше времени.

Не по теме:

Байт, и не говори. :)

1
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 51
30.11.2017, 08:18
Спасибо за объяснение.Нет, у меня n заранее неизвестен, его надо вводить, немного изменил код, но платформа где всё это проверяется выдаёт ошибку (это домашка), а ошибка состоит в том что в самом конце есть пробел(его не должно быть).@stake-k26
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
 
int main (void)
{
    int answer = -1;
    int counter = 0;
    int i;
    int d;
    int n;
    scanf("%d",&n);
    for ( i=1; counter<n; i+=2)
    {
        if (i == 1)
         { 
         answer = 0; 
         printf("2 "); 
         counter++;
          }
        for(d=2; d*d <= i; d++) 
        if (i%d == 0) 
        {
         answer = 0;
          break;
        }
        if (answer < 0) 
        answer = 1;
        if (answer > 0) 
        {
         printf("%i ", i);
         
         counter++;
        }
        answer = -1;
    }
        printf("\n");
    return 0;
}
Добавлено через 2 минуты
тебя спрашивали ? @Байт
0
2485 / 1149 / 709
Регистрация: 25.04.2016
Сообщений: 3,300
30.11.2017, 15:10
Цитата Сообщение от RedRaider Посмотреть сообщение
Нет, у меня n заранее неизвестен, его надо вводить
Поскольку к моменту выполнения цикла n уже известен, т.е. мы знаем до каких пор будет выполняться цикл, мы говорим, что n заранее известно. Нам же не приходится искать n в процессе выполнения цикла?

Цитата Сообщение от RedRaider Посмотреть сообщение
но платформа где всё это проверяется выдаёт ошибку
Значит по условия задания предполагается, что вывод будет сделан определенным образом, например, выводить каждое число с новой строки или еще что-нибудь.

Цитата Сообщение от RedRaider Посмотреть сообщение
немного изменил код
Ну да, некоторые косметические изменения явно присутствуют... \n заменен на пробел, правда почему-то вы пропустили мимо ушей все, что нужно было сделать для устранения ошибки:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
 
int main (void)
{
    int answer = -1;
    int counter = 0;
    int i;
    int d;
    int n;
 
    // узнаем сколько чисел вывести на экран:
    // printf("n = ");
    scanf("%d",&n);
    // fflush(stdin);
 
    // находим простые и выводим на экран:
    for ( i=1; counter<n; i+=2)
    {
        if (i == 1)
        {
            answer = 0;
            printf("2");
            if (++counter < n)
                printf(" ");
        }
        for ( d=2; d*d <= i; d++)
        {
            if (i%d == 0)
            {
                answer = 0;
                break;
            }
        }
        if (answer < 0)
            answer = 1;
        if (answer > 0)
        {
            printf("%i", i);
            if (++counter < n)
                printf(" ");
        }
        answer = -1;
    }
    printf("\n");
    return 0;
}

Не по теме:

Цитата Сообщение от RedRaider Посмотреть сообщение
тебя спрашивали ? @Байт
Допустим, завтра меня не будет на форуме, и не найдется никого, кроме Байта, кто бы смог вам помочь. Уверены, что он захочет вам помогать? Да и уважаемый Байт писал мне, а не вам, так что в данном случае, все несколько наоборот, это именно вас, RedRaider, спросить забыли.

1
30.11.2017, 15:24

Не по теме:

Цитата Сообщение от stake-k26 Посмотреть сообщение
Уверены, что он захочет вам помогать?
Я не уверен. Только если ник забуду...:D


Не по теме:

Записывать, блин, надо... Память совсем дырявая стала... Или какой-нибудь юзер-скрипт сварганить со списком обидчиков...:p

0
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 51
30.11.2017, 15:30
Спасибо.... и всем пис
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2017, 15:30
Помогаю со студенческими работами здесь

Найти первые 15 чисел, больших 100, которые делятся на 19 без остатка
Цифра больше 100 который делится на 19 без остатков первые 15 рещении

Распечатать первые n простых чисел
Распечатать первые n простых чисел (p – простое число, если p &gt;= 2 и делится только на 1 и на себя)

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

Напечатать первые k пар простых чисел
Написать программу, печатающую первые k пар простых чисел. Два числа a и b образуют пару простых чисел, если они оба простые и b=a+2....

Вывести на экран первые n простых чисел
Для заданного n получить таблицу первых n простых чисел. Честно говоря даже идеи никакой нет(


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Blazor и контроллер сервопривода IoT Meadow Maple
Wired 11.07.2025
Я решил разобраться, как можно соединить современные веб-технологии с миром "железа". Интересная комбинация получилась из Blazor в качестве веб-интерфейса и микроконтроллера Meadow с его веб-сервером. . .
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
Изучаем новый шаблон ИИ-чата .NET AI Chat Web App
stackOverflow 10.07.2025
В . NET появилось интересное обновление - новый шаблон ИИ-чата под названием . NET AI Chat Web App. Когда я впервые наткнулся на анонс этого шаблона, то сразу понял, что Microsoft наконец-то. . .
Результаты исследования от команды ARP (июль 2025 г.)
Programma_Boinc 10.07.2025
Результаты исследования от команды ARP (июль 2025 г. ) Африканский проект по дождям (ARP) World Community Grid снова запущен! Мы рады поделиться обновленной информацией о нашем прогрессе с осени. . .
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru