Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
1

Программа нахождения простых чисел

24.07.2016, 14:20. Просмотров 4084. Ответов 25
Метки нет (Все метки)

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


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include <iomanip>
using namespace std;
void main()
{
    int f=0;
    int n=10;
    for (int j=1; j < 10; j++)
    {
        for(int i=1; i<=j/i; i++) 
            if( n%j == 0 ) 
            {
                f=1; break;             
            }
        if(f == 1)  cout<<j<<setw(3);
        f=0;
    }
    cout<<endl;
    system("pause");
}
Программа нахождения простых чисел!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2016, 14:20
Ответы с готовыми решениями:

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

Нахождения больших простых чисел
Нахождения больших простых чисел. Реализовать программу на C++. спасибо за помощь

Алгоритм нахождения простых чисел
Не могу найти в интернете нормальный код алгоритма нахождения простых чисел. Помогите пожалуйста. ...

Алгоритм нахождения простых чисел
Вопросы: 1) Нужен алгоритм проверки числа (является ли число простим). Нужно чтобы алгоритм был...

Алгоритм нахождения простых чисел
Не так давно начал изучать с++. Вот попытался написать программу которая вычисляет простое ли число...

25
Serg_o_Grey
77 / 77 / 40
Регистрация: 29.03.2016
Сообщений: 359
24.07.2016, 14:54 2
123
0
Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
24.07.2016, 14:59  [ТС] 3
Выдало 1.3.5.7.9.
по моему что-то не то!
0
Unknownx
Заблокирован
24.07.2016, 14:59 4
Лучший ответ Сообщение было отмечено Maxim09 как решение

Решение

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>
#include <iomanip>
using namespace std;
int main()
{
    int f = 0;
    for (int j = 1; j <= 10; j++)
    {
        f = 0;
        for(int i = 2; i < j && f == 0; i++) 
        {
            if( j % i == 0 ) 
            {
                f = 1;  
                break;       
            }
        }
        if(f == 0)  
            cout<<j<<setw(3);
    }
    cout<<endl;
    cin.get();
    return 0;
}
http://codepad.org/sGec7kGQ
1 2 3 5 7
1
Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
24.07.2016, 15:00  [ТС] 5
Нету 2-ки и 9 делится не только на себя и 1, а ещё и на 3 ведь!
0
Unknownx
24.07.2016, 15:00
  #6

Не по теме:

Цитата Сообщение от Maxim09 Посмотреть сообщение
9.
- конечно не то, у тебя сама проверка неверная, почему ты делишь 10-ку а не находишь остаток от деления числа на число?

0
Serg_o_Grey
77 / 77 / 40
Регистрация: 29.03.2016
Сообщений: 359
24.07.2016, 15:00 7
Лучший ответ Сообщение было отмечено Maxim09 как решение

Решение

исправился
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
#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
    int f=0;
    //int n=10;
    for (int j=1; j < 10; j=j+2)
    {
        f=0;
        for(int i=3; i<=j; i=i+2)
        {
            if  (j%i == 0 )
            {
                if(j == i)
                {
                    f=1;
                }
                else 
                {
                    f=0;
                    break;
                }
            }
        }
        if(f == 1)  cout<<j<<setw(3);
    }
    cout<<endl;
    system("pause");
    return 0;
}
1
Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
24.07.2016, 15:18  [ТС] 8
10-ую строку не пойму

Добавлено через 4 минуты
Поясните мне 10 строку а-то не дошло как-то !
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>
#include <iomanip>
using namespace std;
int main()
{
    int f = 0;
    for (int j = 1; j <= 10; j++)
    {
        f = 0;
        for(int i = 2; i < j && f == 0; i++) 
        {
            if( j % i == 0 ) 
            {
                f = 1;  
                break;       
            }
        }
        if(f == 0)  
            cout<<j<<setw(3);
    }
    cout<<endl;
    cin.get();
    return 0;
}
Добавлено через 46 секунд
А именно
C++
1
j && f == 0
!!!

Добавлено через 10 минут
Опять не то
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
#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
    int f=0;
    //int n=10;
    for (int j=1; j < 10; j=j+2)
    {
        f=0;
        for(int i=3; i<=j; i=i+2)
        {
            if  (j%i == 0 )
            {
                if(j == i)
                {
                    f=1;
                }
                else 
                {
                    f=0;
                    break;
                }
            }
        }
        if(f == 1)  cout<<j<<setw(3);
    }
    cout<<endl;
    system("pause");
    return 0;
}
Добавлено через 34 секунды
Выдаёт 3.5.7.
0
SerVal
28 / 27 / 9
Регистрация: 16.04.2015
Сообщений: 262
24.07.2016, 15:18 9
Не правильно вы ребятки пишете.

Лучше вот как:
Пишем функцию, которая возвращает ответ - простое это число или нет:

C++
1
2
3
4
5
bool isPrime(unsigned int candidate)
{
      //если кандидат простое число return true;
      //return  false;
}
А потом main :
C++
1
2
3
4
5
6
7
8
int main()
{
    for (int i = 0; i< 10; i++)
    {
           if (isPrime(i))
        std::cout << i << " ";
    }
}
По крайней мере, понятно, что делается.
1
Serg_o_Grey
77 / 77 / 40
Регистрация: 29.03.2016
Сообщений: 359
24.07.2016, 15:30 10
Цитата Сообщение от Maxim09 Посмотреть сообщение
Опять не то
Цитата Сообщение от Maxim09 Посмотреть сообщение
Выдаёт 3.5.7.
все то. 1 и 2 дописать самостоятельно можно. кроме того число 2 является единственным четным в ряде простых чисел, что наводит на мысль - "а стоит ли его воспринимать как простое?"
1 - делится на любое число, что мне, лично тоже не нравится (это скорее фундаментальное число, которое как простое тоже воспринимать не имеет смысла)
Практической пользы в них нет
0
Unknownx
Заблокирован
24.07.2016, 15:34 11
Чисто для себя узнать, мой корректный алгоритм нарочно игнорируется?
Кликните здесь для просмотра всего текста
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>
#include <iomanip>
using namespace std;
int main()
{
    int f = 0;
    for (int j = 1; j <= 100; j++)
    {
        f = 0;
        for(int i = 2; i < j && f == 0; i++) 
        {
            if( j % i == 0 ) 
            {
                f = 1;  
                break;       
            }
        }
        if(f == 0)  
            cout<<j<<setw(3);
    }
    cout<<endl;
    cin.get();
    return 0;
}

http://codepad.org/awxC15H7 ?
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
- никак не могу понять, как имея корректный код мучатся и далее, лан видимо я что то не понимаю в жизни...
0
Maxim09
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
24.07.2016, 15:39  [ТС] 12
Unknownx,
Ваш алгоритм я понял и благодарен вам за помощь!
А вот алгоритм другого товарища Serg_o_Grey, не совсем вот и колупаю маленько

Добавлено через 1 минуту
Только вот не пойму а какое действие делает вот эта часть кода:
C++
1
j && f == 0
0
shilko2013
250 / 227 / 185
Регистрация: 02.04.2016
Сообщений: 892
Завершенные тесты: 2
24.07.2016, 15:40 13
Вообще-то есть решето Эратосфена
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
47
48
49
#include <iostream>
#include <iomanip> // содержится прототип манипулятора setw()
using namespace std;
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "rus");
    int n; // правая граница интервала
    cout << "Введите число - N: ";
    cin >> n;
 
    int size_array = n - 2; // так как первое простое число - это 2, то размер массива уменьшаем на 2, так как 0 и 1 не в счёт     
    int *arrayPtr = new int [size_array]; // создаём одномерный динамический массив размером n - 2
 
    for(int counter = 0; counter <= size_array; counter++)
    {
        arrayPtr[counter] = counter + 2; // записываем в массив все числа в интервале [2;n]
    }
    int p = 2; // первое простое число
    int index = 0; // переменная  для прохода по элементам массива
 
    // в цикле while реализовано решето Эратосфена
    while (p < n) // пока значение переменной p меньше введённого n
    {
        // в цикле for отсеиваем составные числа
        for (int counter = p*p - 2; counter <= size_array; counter += p)
        {
            arrayPtr[counter] = -1; // на места составных чисел присваиваем значение -1
        }
 
        // в цикле while изменяем значение переменной p
        while (arrayPtr[index] <= p ) // пока значение из массива чисел меньше либо равно значению переменной p
        {
            index++; // переключаться на следующий элемент массива
        }
        p = arrayPtr[index]; // нужное значение массива найдено, поэтому присваиваем его переменной p
    } // конец алгоритма Эратосфена
 
    // вывод на экран простых чисел
    for(int counter = 0; counter <= n - 2; counter++)
    {
        if (arrayPtr[counter] != -1) // если элемент массива не равен -1
        cout << setw(2) << arrayPtr[counter] << " "; // сделать вывод на экран
    }
 
    cout << endl;
    system("pause");
    return 0;
}
1
SerVal
28 / 27 / 9
Регистрация: 16.04.2015
Сообщений: 262
24.07.2016, 15:40 14
Цитата Сообщение от Unknownx Посмотреть сообщение
Чисто для себя узнать, мой корректный алгоритм нарочно игнорируется?
Алгоритм - это когда всё понятно. А у Вас - непонятно!
Вывод на экран это часть алгоритма?
0
Serg_o_Grey
77 / 77 / 40
Регистрация: 29.03.2016
Сообщений: 359
24.07.2016, 15:45 15
Maxim09, в алгоритме товарища Unknownx, лишние действия выполняются, а именно проверка четных чисел, что не рационально, но тем не менее правильно
1
SerVal
28 / 27 / 9
Регистрация: 16.04.2015
Сообщений: 262
24.07.2016, 15:45 16
Цитата Сообщение от shilko2013 Посмотреть сообщение
Вообще-то есть решето Эратосфена
У него только один недостаток - оно не распараллеливается.
То есть, от 4-х ядер процессора - никакого толку. Правда, Эратосфен в этом не виноват.
0
Unknownx
Заблокирован
24.07.2016, 15:50 17
Цитата Сообщение от SerVal Посмотреть сообщение
Алгоритм - это когда всё понятно. А у Вас - непонятно!
- а ну тогда раз дело в этом, то что есть простое число - это число которое делится только на себя, т.е на 1-цу и на самого себя

Возьмём к примеру числа 7-мь и 8-мь и пройдёмся по всем возможным делителям

Цитата Сообщение от Maxim09 Посмотреть сообщение
if *(j%i == 0 )
- если кто забыл это остаток от целочисленного деления т.е пока число делится с остатком мы идём дальше, как только поделилось нацело то стопорим алгоритм
итак 7-ка
7 % 2 остаток 1
7 % 3 есть остаток 1
7 % 4 есть остаток 3
7 % 5 есть остаток 2
7 % 6 есть остаток 1
итак весь цикл чисел от 2-ки до 7-ки не дал ни одного целого делителя, значит у числа просто нет дургих делителей кроме как 1 и само число

Теперь 8-ка
8 % 2 == 0 ага остаток 0 - останавливаем цикл и не печатаем число(под условием if( f == 0 ) можно записать добавление в вектор и всё что угодно, я просто ограничился печатанием простых чисел)

Добавлено через 3 минуты
Касательно 1-цы и двойки, с ними цикл по i просто не начинается, надеюсь теперь всё понятно
0
Serg_o_Grey
77 / 77 / 40
Регистрация: 29.03.2016
Сообщений: 359
24.07.2016, 15:52 18
Цитата Сообщение от shilko2013 Посмотреть сообщение
Вообще-то есть решето Эратосфена
задача была поставлена именно данный автором код подправить

Добавлено через 1 минуту

Не по теме:


Цитата Сообщение от Unknownx Посмотреть сообщение
Цитата Сообщение от SerVal Посмотреть сообщение
Алгоритм - это когда всё понятно. А у Вас - непонятно!
Unknownx, с товарищем SerVal, в другой теме встречался, он не очень-то сильно понимает...

0
SerVal
28 / 27 / 9
Регистрация: 16.04.2015
Сообщений: 262
24.07.2016, 15:56 19
Во-первых, непонятно, какое отношение к алгоритму имеет функция main?

Цитата Сообщение от Unknownx Посмотреть сообщение
Теперь 8-ка
8 % 2 == 0 ага остаток 0
На двойку-то зачем делить??? В самом начале надо
C++
1
if ((candidate & 1) == 0) return false; // число чётное
0
Serg_o_Grey
77 / 77 / 40
Регистрация: 29.03.2016
Сообщений: 359
24.07.2016, 16:01 20
Цитата Сообщение от SerVal Посмотреть сообщение
Зачем делить-то???
C++
Выделить код
1
if ((candidate & 1) == 0) return false; // число чётное
if ((15 & 1) == 0) return false; // число нечетное
и что?
0
24.07.2016, 16:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2016, 16:01

Алгоритм нахождения ПРОСТЫХ чисел в файле
Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Из файла f ...

Написать программу нахождения первых 50 простых чисел
Написать программу нахождения первых 50 простых чисел...Помогите пожалустно если можно то с...

Напишите программу нахождения всех трехзначных простых чисел
Найти все трехзначные простые числа


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru