Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
1

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

12.11.2012, 19:22. Показов 1541. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Подскажите. что не так?

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

Делала так:

прохожусь по всем числам и проверяют остаток от деления на числа меньше (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");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2012, 19:22
Ответы с готовыми решениями:

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

Smile SEO Tools - ткните пальцем плз!!!
Пожалуйста не шлите в ПОиск, там этого нету...=) Поставил демку (кто забыл - она там...

Ткните, пожалуйста, носом в ошибку. я не могу понять где, что не так
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;RUSSIAN&quot;); cout...

Мы вводим натуральное число N, переводим в двоичный вид все числа от 1 до N и выводим на экран. Не могу найти ошибку
Мы вводим натуральное число N, переводим в двоичный вид все числа от 1 до N и выводим на экран. Не...

19
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
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;
}
0
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 19:33  [ТС] 3
mster-doc, СПАСИБО, но боюсь
std:: здесь на при чем...
в 5 Builder и так печать на экран выводится.

тут что-то другое...
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
12.11.2012, 19:34 4
Цитата Сообщение от YuTu Посмотреть сообщение
добавила if
if то здесь зачем? Перебери до двойки и всё.
0
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
12.11.2012, 19:36 5
Просто вы не уточнили) \ под Dev-C++ корректировал
#include <iostreame.h> - #include <iostream>
может в этом дело было)
1
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 19:37  [ТС] 6
Цитата Сообщение от taras atavin Посмотреть сообщение
if то здесь зачем? Перебери до двойки и всё.
в смысле "до двойки" а 5, 10, и т.д. (задача стоит перебрать интервал до 1000)
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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. Делить по идее надо только на простые и только те, на которое оно предположительно может разделиться. Самое большое число, на что может разделиться чётное, это половина самого числа. Самое больше, на которое может разделиться не чётное, но кратное трём, это вообще треть самого числа. И так далее. А если делитель больше половины, то это уже не делитель. Для чётных всё, что больше трети, уже не делители. И так далее. Ну может не до двойки, а с двойки. Но двойка в одном пределе обязательна.
0
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 19:39  [ТС] 8
Цитата Сообщение от mster-doc Посмотреть сообщение
Просто вы не уточнили) \ под Dev-C++ корректировал
#include <iostreame.h> - #include <iostream>
может в этом дело было)
У меня проблема, как я поняла, с вычленением собственно простых чисел. так выводится весь указанный диапазон. от 2 до 9
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
12.11.2012, 19:43 9
Цитата Сообщение от taras atavin Посмотреть сообщение
f=true;
* * break;
f=false;. Тру - это только в заголовке.
0
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
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;
}
1
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 20:35  [ТС] 11
taras atavin,
что-то я все равно не поняла...
Вы предлагаете разобрать числа на четные, нечетные, те, что без остатка делятся на определенное число и потом проверять остаток от деления на числа меньше половины, трети и т.д.

так? а зачем сложный переключатель f?
Ведь по сути у меня в коде так и написано, или не так?
а что это за функция Isi?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 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 наоборот
0
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 20:43  [ТС] 13
Цитата Сообщение от mster-doc Посмотреть сообщение
я как из вашего кода понял, то вам ножнобыло от 2 до 9
Я думала это не критично. Так для отладки проще.

Спасибо.
А в строке 19 переменная flag увеличивается каждый раз когда чило делится нацело на едииницу, а в строке 23 выводится на экран число, в случае перебора "меньшей половины" и успешного деления нацело. так это не будет простое число... или я не права?...
0
576 / 559 / 47
Регистрация: 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/ не грузится?

1
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2012, 21:05 15
I.M., а зачем перебирать только четные числа?
0
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?

В принципе ответы уже додумала себе, но на будующее хочется оригинал узнать.
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.11.2012, 21:31 17
YuTu,
Быстрая проверка натурального числа на простоту
там есть функции проверки чисел на простоту и генерирование простых чисел в заданном диапазоне.
1
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
12.11.2012, 21:56  [ТС] 18
Цитата Сообщение от Thinker Посмотреть сообщение
YuTu,
Быстрая проверка натурального числа на простоту
там есть функции проверки чисел на простоту и генерирование простых чисел в заданном диапазоне.
+1000 Спасибо большое!!!! я знала, что где-то здесь математический момент есть...
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
12.11.2012, 22:24 19
Цитата Сообщение от Thinker Посмотреть сообщение
I.M., а зачем перебирать только четные числа?
Перепутал) не туда и не так += 2 вписал.
Я имел в виду, что на простоту надо проверять только нечетные числа. Но мои руки записали это вот так
0
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 18
14.11.2012, 00:08  [ТС] 20
БОЛЬШОЕ СПАСИбО ВСЕМ УЧАСТНИКАМ!!!
0
14.11.2012, 00:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2012, 00:08
Помогаю со студенческими работами здесь

Ткните в ошибку
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Ткните носом в ошибку
Подскажите ошибку. Говорит syntax error в 19-ой строке (даже местный хайлайтер ее не раскрашивает)....

Ткните носом в ошибку
Есть задача: отсеять по шаблону строки, которые не содержат выражение needle. Решение нашёл: 1....

Ткните лицом в ошибку в коде
В общем написал код для данного задания: &quot;Задать два массива целых чисел с помощью датчика...


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

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