Форум программистов, компьютерный форум CyberForum.ru

Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку - C++

Восстановить пароль Регистрация
 
YuTu
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 19:22     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #1
Здравствуйте.
Подскажите. что не так?

Задача: Вывести на экран ПРОСТЫЕ ЧИСЛА в указанном диапазоне.

Делала так:

прохожусь по всем числам и проверяют остаток от деления на числа меньше (i). Для этого добавила встроенный for. А внутри для исключения случаев типа "4" (нацело не делится на 3, а на 2 делится, т.е. остаток от деления =0 ) добавила if

Выводит все подряд.. подозреваю break не так как-то работает...
уже и через while делала.

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

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream.h>
 
void main()
{
 
for (int i=2; i<10; i++)
{
 
   for (int j=2; j<i;j++)
   {
     if(i%j)
     {
       cout <<"i="<<i<<"\n";
       break; 
     }
   }
 
}
 
system ("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2012, 19:22     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку
Посмотрите здесь:

ткните пальцем C++
Даны натуральные числа p и q. Получить все делители числа q, взаимно простые к p. C++
C++ Даны целые числа р и q. Получить все делители числа q, взаимно простые с р
Даны целые числа р и q. Получить все делители числа q, взаимно простые с р. C++
C++ Даны натуральные числа a,b(a<= Ь). Получить все простые числа р, удовлетворяющие неравенствам a<= р<= b.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
12.11.2012, 19:30     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #2
Вот)) надеюсь то что вы хотели) данные я не менял, просто поправил код чтобы работал)
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>
 
int main()
{
 
for (int i=2; i<10; i++)
{
 
   for (int j=2; j<i;j++)
   {
     if(i%j)
     {
       std::cout << "i=" << i <<"\n";
       break; 
     }
   }
 
}
 
system ("pause");
return 0;
}
YuTu
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 19:33  [ТС]     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #3
mster-doc, СПАСИБО, но боюсь
std:: здесь на при чем...
в 5 Builder и так печать на экран выводится.

тут что-то другое...
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.11.2012, 19:34     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #4
Цитата Сообщение от YuTu Посмотреть сообщение
добавила if
if то здесь зачем? Перебери до двойки и всё.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
12.11.2012, 19:36     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #5
Просто вы не уточнили) \ под Dev-C++ корректировал
#include <iostreame.h> - #include <iostream>
может в этом дело было)
YuTu
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 19:37  [ТС]     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #6
Цитата Сообщение от taras atavin Посмотреть сообщение
if то здесь зачем? Перебери до двойки и всё.
в смысле "до двойки" а 5, 10, и т.д. (задача стоит перебрать интервал до 1000)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.11.2012, 19:38     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #7
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
void Isi(int start, int end)
{
 int i;
 int d;
 bool f;
 if (start<2)
 {
  ++start;
 }
 for (i=start; i<=end; ++i)
 {
  for (f=true, d=2; d<i; ++d)
  {
   if ((i%d)==0)
   {
    f=true;
    break;
   }
   if (f)
   {
    std::cout<<i<<" ";
   }
  }
 }
}
Добавлено через 1 минуту
Цитата Сообщение от YuTu Посмотреть сообщение
в смысле "до двойки" а 5, 10, и т.д. (задача стоит перебрать интервал до 1000)
До двойки. Вопрос, надо ли проверять от i-1. Делить по идее надо только на простые и только те, на которое оно предположительно может разделиться. Самое большое число, на что может разделиться чётное, это половина самого числа. Самое больше, на которое может разделиться не чётное, но кратное трём, это вообще треть самого числа. И так далее. А если делитель больше половины, то это уже не делитель. Для чётных всё, что больше трети, уже не делители. И так далее. Ну может не до двойки, а с двойки. Но двойка в одном пределе обязательна.
YuTu
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 19:39  [ТС]     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #8
Цитата Сообщение от mster-doc Посмотреть сообщение
Просто вы не уточнили) \ под Dev-C++ корректировал
#include <iostreame.h> - #include <iostream>
может в этом дело было)
У меня проблема, как я поняла, с вычленением собственно простых чисел. так выводится весь указанный диапазон. от 2 до 9
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.11.2012, 19:43     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #9
Цитата Сообщение от taras atavin Посмотреть сообщение
f=true;
* * break;
f=false;. Тру - это только в заголовке.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
12.11.2012, 20:18     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #10
я как из вашего кода понял, то вам ножнобыло от 2 до 9
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
#include <iostream>
#include <windows.h>
 
using namespace std;
 
int main()
{
     int flag=0;
     for(int i=2; i<10; i++)
     {
             for(int j=1; j<=i; j++)
             {
                     if(i==2)
                     {
                             continue;
                     }
                     if(i%j==0)
                     {
                               flag++;
                     }
                     if(j==i/2 && flag==1)
                     {
                               cout <<i<<endl;
                               flag=0;
                     }
                     if(flag>1)
                     {
                                flag=0;
                                break;
                     }
             }
     }
     system("pause");
     return 0;
}
YuTu
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 20:35  [ТС]     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #11
taras atavin,
что-то я все равно не поняла...
Вы предлагаете разобрать числа на четные, нечетные, те, что без остатка делятся на определенное число и потом проверять остаток от деления на числа меньше половины, трети и т.д.

так? а зачем сложный переключатель f?
Ведь по сути у меня в коде так и написано, или не так?
а что это за функция Isi?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
12.11.2012, 20:43     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #12
Вот же! В соседней теме отвечал:
C++
1
2
3
4
5
6
7
8
9
int isPrime(const int N){
    int divisor=3;
    if (!(N&1)) return 0;
    while(divisor*divisor<=N){
                             if (N%divisor) return 0;
                             divisor+=2;
                             }
    return 1;   
    }
Возвращает 1 если простое и 0 наоборот
YuTu
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 20:43  [ТС]     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #13
Цитата Сообщение от mster-doc Посмотреть сообщение
я как из вашего кода понял, то вам ножнобыло от 2 до 9
Я думала это не критично. Так для отладки проще.

Спасибо.
А в строке 19 переменная flag увеличивается каждый раз когда чило делится нацело на едииницу, а в строке 23 выводится на экран число, в случае перебора "меньшей половины" и успешного деления нацело. так это не будет простое число... или я не права?...
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
12.11.2012, 20:47     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #14
YuTu,
Кликните здесь для просмотра всего текста
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
#include <cmath>
#include <iostream>
 
bool is_prime(int value)
{
    if (!value)return false;
        
    for (int i = 2, end = sqrt((double)value); i <= end; i += 2)
    {
        if (value % i == 0)
        {
            return false;
        }
    }
    return true;
}
 
int main()
{ 
    for (int i = 2; i < 10; ++i)
    {
        if (is_prime(i))
        {
            std::cout << "i = " << i << std::endl;
        }
    }    
    system ("pause");
    return 0;
}


Добавлено через 43 секунды

Не по теме:

Никто не в курсе, почему http://liveworkspace.org/ не грузится?

Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2012, 21:05     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #15
I.M., а зачем перебирать только четные числа?
YuTu
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 21:25  [ТС]     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #16
Цитата Сообщение от I.M. Посмотреть сообщение
YuTu,
Кликните здесь для просмотра всего текста
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
#include <cmath>
#include <iostream>
 
bool is_prime(int value)
{
    if (!value)return false;
        
    for (int i = 2, end = sqrt((double)value); i <= end; i += 2)
    {
        if (value % i == 0)
        {
            return false;
        }
    }
    return true;
}
 
int main()
{ 
    for (int i = 2; i < 10; ++i)
    {
        if (is_prime(i))
        {
            std::cout << "i = " << i << std::endl;
        }
    }    
    system ("pause");
    return 0;
}

Спасибо большое! , все ок. Только если диапазон до 10, а если расширить его до 100 уже выводятся и непростые числа...
1. Строка 6 зачем нужна? (защита "от дураков") если value 0. так она изначально может быть только от 2
2. for (int i = 2, end = sqrt((double)value); i <= end; i += 2)
(double)value - если я ничего не путаю, то это приведение пита данных к double ? почему имеено до квадратного корня из числа происходит перебор? почему итератор увеличивается на 2?

В принципе ответы уже додумала себе, но на будующее хочется оригинал узнать.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2012, 21:31     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #17
YuTu,
Быстрая проверка натурального числа на простоту
там есть функции проверки чисел на простоту и генерирование простых чисел в заданном диапазоне.
YuTu
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 21:56  [ТС]     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #18
Цитата Сообщение от Thinker Посмотреть сообщение
YuTu,
Быстрая проверка натурального числа на простоту
там есть функции проверки чисел на простоту и генерирование простых чисел в заданном диапазоне.
+1000 Спасибо большое!!!! я знала, что где-то здесь математический момент есть...
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
12.11.2012, 22:24     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #19
Цитата Сообщение от Thinker Посмотреть сообщение
I.M., а зачем перебирать только четные числа?
Перепутал) не туда и не так += 2 вписал.
Я имел в виду, что на простоту надо проверять только нечетные числа. Но мои руки записали это вот так
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2012, 00:08     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку
Еще ссылки по теме:

C++ Найти все трехзначные простые числа. Определить функцию позволяющую распознавать простые числа
Ткните, пожалуйста, носом в ошибку. я не могу понять где, что не так C++
C++ Ткните лицом в ошибку в коде

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

Или воспользуйтесь поиском по форуму:
YuTu
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
14.11.2012, 00:08  [ТС]     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку #20
БОЛЬШОЕ СПАСИбО ВСЕМ УЧАСТНИКАМ!!!
Yandex
Объявления
14.11.2012, 00:08     Выводим ПРОСТЫЕ числа. Ткните, пожалуйста, пальцем в ошибку
Ответ Создать тему
Опции темы

Текущее время: 03:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru