0 / 0 / 0
Регистрация: 18.08.2011
Сообщений: 3
1

Вывести простые числа в диапазоне от 2 до 1000

18.08.2011, 04:01. Показов 19750. Ответов 35

Author24 — интернет-сервис помощи студентам
Здраствуйте, есть задачка:

Создать программу, которая выводит на экран простые числа в диапазоне от 2 до 1000. (Число называется простым, если оно делится только на 1 и на само себя без остатка; причем числа 1 и 2 простыми не считаются).


Пробую следующим образом, но выводит все цыфры от 3 до 999

Вот как пробую я:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
void main()
 
{
    int i=3, j;
 
    while(i<1000){ 
    j=i-1; //переменная j всегда начинает считаться на 1 меньше переменной i, поскольку число может делиться на самого себя
        while (j>1) { // j>1 поскольку число может делиться на 1
            if (i%j!=0) // например 3 делим по модулю на 2 = 1.5, 5!=0 - подходит, 4%2=0 - не подходит 
            { 
                cout<<i <<' ';
            }
            j--; //уменьшаем j чтобы проделить на все числа на единицу меньше числа і и больше 1
            break;
        }
        i++;
        
    }
 
}
В чем моя ошибка, помогите плиз, заранее благодарен
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2011, 04:01
Ответы с готовыми решениями:

Найти простые числа в диапазоне от 1 до 1000
Задание звучит так Написать программу поиска простых чисел из множества натуральных чисел от 1 до...

Перебором делителей найти простые числа в указанном диапазоне, и вывести все простые числа в поле Memo
Мне нужна программка на Delphi, которая простым перебором делителей находит простые числа в...

Создать программу, которая выводит на экран простые числа в диапазоне от 2 до 1000
Создать программу, которая выводит на экран простые числа в диапазоне от 2 до 1000. (Число...

Создать программу, которая выводит на экран простые числа в диапазоне от 2 до 1000
Создать программу, которая выводит на экран простые числа в диапазоне от 2 до 1000. (Число...

35
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
18.08.2011, 23:55 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от grizlik78 Посмотреть сообщение
Sieve of Atkin? Сам придумал?
Писал, чтобы решить задачку на одном из сайтов. Правда тогда мне этот метод не понадобился, но исходник вот остался.
Где-то, кстати, читал, что решето Аткина проигрывает решету Эратосфена на практике, хотя по асимптотике должно быть наоборот, но выигрыш заметен только на числах близких к 10^9.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
19.08.2011, 00:53 22
Цитата Сообщение от fasked Посмотреть сообщение
Где-то, кстати, читал, что решето Аткина проигрывает решету Эратосфена на практике, хотя по асимптотике должно быть наоборот, но выигрыш заметен только на числах близких к 10^9.
Ну при прямолинейной реализации да, но решето Аткина, позволяет экономить память, как минимум. Для Эратосфена я не представляю, как уменьшить прожорливость. В английской википедии есть ссылка на довольно неплохо оптимизированную реализацию генератора, выполненную одним из авторов алгоритма (Бернштайн).
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
19.08.2011, 02:36 23
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну при прямолинейной реализации да, но решето Аткина, позволяет экономить память, как минимум. Для Эратосфена я не представляю, как уменьшить прожорливость. В английской википедии есть ссылка на довольно неплохо оптимизированную реализацию генератора, выполненную одним из авторов алгоритма (Бернштайн).
Я, на самом-то деле, понятия не имею, в какой сфере нужны такие простые числа. Я имею в виду, именно диапазоны именно небольших чисел. А генерировать диапазоны больших простых чисел... опять же зачем, да и наверное это утомительно долго
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.08.2011, 03:19 24
Решение в лоб.


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 <iostream>
int main()
{
    bool flag;
 
    for ( int i = 2; i <= 1000; i++ )
    {
        flag = false;
 
        for ( int j = 2; j <= i / 2 ); j++ )
        {
            if ( i % j == 0 )
            {
                flag = true;
                break;
            }
        }
 
        if ( !flag )
            std::cout << i << std::endl;
    }
 
    return 0;
}
Для небольших диапазонов. Для больших конечно лучше использовать перебор до корня.

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
#include <iostream>
#include <cmath>
 
int main()
{
    bool flag;
 
    for ( int i = 2; i <= 1000; i++ )
    {
        flag = false;
 
        for ( int j = 2; j <= sqrt( static_cast< double > ( i ) ); j++ )
        {
            if ( i % j == 0 )
            {
                flag = true;
                break;
            }
        }
 
        if ( !flag )
            std::cout << i << std::endl;
    }
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 18.08.2011
Сообщений: 3
19.08.2011, 03:50  [ТС] 25
спасибо всем за ответы/советы,

но я не могу понять таки почему ошибка в изначальном посте или следующем коде:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
void main()
 
{
        int i, j;
 
       for (i=3; i<=1000; i++) {
 
           
           for (j=i-1; j<=999, j>1; j--) { //судя по логике число нужно делить на все числа кроме его самого и 1 потому начинаем делить с числа на 1 меньше его самого до 2
               if (i%j!=0) { //проверяем условие - если число простое
               cout<<i<<' '; //выводим i
               break; //останавливаем внутренниы цыкл, переходим к внешнему, где делается i++ и все по новой
               }
           }
       }
}
Так почему же код выводит все цыфры, я только начал учить С, просьба объяснить как чайнику

Большое спасибо!
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
19.08.2011, 03:57 26
Цитата Сообщение от Alex P
просьба объяснить как чайнику
ты не знаешь, что такое простое число
прочитай определение
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
19.08.2011, 04:04 27
Alex P, у тебя получается, что если проверяемое число не делится на какое-нибудь число, то проверяемое — простое. Но на самом деле-то наоборот: если число делится на какое-нибудь (кроме себя и единицы), то оно составное.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
int main()
{
    int i, j;
 
    for (i=3; i<=1000; i++) {
        for (j=i-1; j>1; j--) { //судя по логике число нужно делить на все числа кроме его самого и 1 потому начинаем делить с числа на 1 меньше его самого до 2
            if (i%j==0) { //проверяем условие - если число составное
                break; //останавливаем внутренний цикл, переходим к внешнему, где делается i++ и все по новой
            }
        }
        if (1 == j)
            cout<<i<<' '; //выводим i
    }
}
1
848 / 190 / 18
Регистрация: 01.08.2011
Сообщений: 505
19.08.2011, 09:14 28
Можно на маленькую капельку усовершенствовать алгоритм:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
int main()
{
    int i, j;
 
    cout << 2 << '\n';
    for (i = 3; i <= 1000; i += 2) // проверяем только нечетные числа
    {
            j = 3;
            while (i % j && j*j <= i)   // вариант без использования функции sqrt()
               j += 2;
 
            if (j*j > i)
                cout << i << '\n';
    }
    return 0;
}
Добавлено через 15 минут
Toshkarik, вы собираетесь вызывать функцию sqrt() для одного и того же значения i столько раз, сколько шагов итерации будет совершено:

C++
1
for ( int j = 2; j <= sqrt( static_cast< double > ( i ) ); j++ )
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.08.2011, 16:36 29
Цитата Сообщение от Olga_ Посмотреть сообщение
Можно на маленькую капельку усовершенствовать алгоритм:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
int main()
{
    int i, j;
 
    cout << 2 << '\n';
    for (i = 3; i <= 1000; i += 2) // проверяем только нечетные числа
    {
            j = 3;
            while (i % j && j*j <= i)   // вариант без использования функции sqrt()
               j += 2;
 
            if (j*j > i)
                cout << i << '\n';
    }
    return 0;
}
Добавлено через 15 минут
Toshkarik, вы собираетесь вызывать функцию sqrt() для одного и того же значения i столько раз, сколько шагов итерации будет совершено:

C++
1
for ( int j = 2; j <= sqrt( static_cast< double > ( i ) ); j++ )
Я писал на быструю руку, код не компилил. Да, можно определять корень из i всего один раз.
0
fasked
19.08.2011, 16:41
  #30

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
Я писал на быструю руку, код не компилил.
Не отмазывайтесь :D

0
Toshkarik
20.08.2011, 14:39
  #31

Не по теме:

Да я серьезно :) В студии бы у меня был другой немного код :) Просто я относительно недавно решал такую же задачу у Дейтлов. Вот переделал и проверил

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
#include "stdafx.h"
 
int main()
{
    setlocale( LC_ALL, "RUS" );
 
    bool flag;
    double squart;
 
    for ( int i = 2; i <= 30000; i++ )
    {
        flag = false;
        squart = sqrt( static_cast< double > ( i ));
 
        for ( int j = 2; j <= squart; j++ )
        {
            if ( i % j == 0 )
            {
                flag = true;
                break;
            }
        }
 
        if ( !flag )
            std::cout << i << std::endl;
    }
 
    system( "PAUSE" );
    return 0;
}

1
Путешественник вселенной
189 / 160 / 119
Регистрация: 01.03.2011
Сообщений: 664
20.08.2011, 16:05 32
Честно взято из своего самоучителя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
int main()
{
    int i,j;
    bool is;
    
for (i=2; i<1001; i++)
{
   is=true;
   for (j=2; j<=i/2; j++)
   if ((i%j)==0) is= false;
   if (is)
   cout <<i<<" ";
    }
    system("pause");
    return 0;
}
1
848 / 190 / 18
Регистрация: 01.08.2011
Сообщений: 505
20.08.2011, 18:11 33
Цитата Сообщение от Просто лис Посмотреть сообщение
Честно взято из своего самоучителя...
А теперь попытайтесь данный алгоритм оптимизировать, а то пока он в крайне корявом виде, и вам тренировка.
0
Путешественник вселенной
189 / 160 / 119
Регистрация: 01.03.2011
Сообщений: 664
21.08.2011, 03:15 34
Olga_, что оптимизировать то? У меня объём знаний языка С++, только на такую программу.
0
848 / 190 / 18
Регистрация: 01.08.2011
Сообщений: 505
21.08.2011, 20:48 35
Цитата Сообщение от Просто лис Посмотреть сообщение
Olga_, что оптимизировать то? У меня объём знаний языка С++, только на такую программу.
Поскольку алгоритм вы взяли из книги, а алгоритм совсем не оптимальный, то можно вам попытаться его переделать. Сначала посмотрите на этот цикл
C++
1
for (j=2; j<=i/2; j++)
попробуйте усовершенствовать. Потом посмотрите на цикл с телом
C++
1
2
for (j=2; j<=i/2; j++)
   if ((i%j)==0) is= false;
тоже попробуйте понять почему так не очень хорошо.
1
0 / 0 / 0
Регистрация: 18.08.2011
Сообщений: 3
23.08.2011, 22:10  [ТС] 36
Всем спасибо!
0
23.08.2011, 22:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2011, 22:10
Помогаю со студенческими работами здесь

Вывести простые числа на интервале от 2 до 1000
Создать программу, которая выводит на экран простые числа в диапазоне от 2 до 1000. (Число...

Вывести на экран все целые числа в диапазоне от 1 до 1000
Вывести на экран все целые числа в диапазоне от 1 до 1000, которые представимы в виде n3+m2 , но не...

Вывести числа, заканчивающиеся на 3 или 5, находящиеся в диапазоне от 1 до 1000
Добрый день! не могли бы мне помочь решить вот задачу запрограммированную в кнопку на форме ...

Вывести все простые числа в диапазоне от a до b
Напишите программу , которая вводит натуральные числа a и b и выводит все простые числа в диапазоне...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru