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

Найти числа имеющие ровно два различных натуральных делителя

10.10.2020, 11:46. Показов 12590. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Готовлюсь к КЕГЭ 2021 и пишу в основном на с++.Т.к все разборы задач на паскале или питоне, то решила обратиться к вам т.к не могу решить задачу

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [174457; 174505], числа, имеющие ровно два различных натуральных делителя, не считая единицы и самого числа. Для каждого найденного числа запишите эти два делителя в две соседних столбца на экране с новой строки в порядке возрастания произведения этих двух делителей. Делители в строке также должны следовать в порядке возрастания.

Например, в диапазоне [5; 9] ровно два целых различных натуральных делителя имеют числа 6 и 8, поэтому для этого диапазона вывод на экране должна содержать следующие значения:
2 3
2 4

Пыталась сделать через массив, но выводит что-то странное вместо вот этого
3 58153
7 24923
59 2957
13 13421
149 1171
5 34897
211 827
2 87251

Помогите пожалуйста, буду очень благодарна.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2020, 11:46
Ответы с готовыми решениями:

На заданном интервале найти числа, имеющие два различных натуральных делителя, исключая 1 и само число
Здравствуйте, помогите пожалуйста с задачей. Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку , числа,...

найти все целые числа от 1 до 300, имеющие ровно 5 делителей
найти все целые числа от 1 до 300, имеющие ровно 5 делителей

У скольких чисел от 1 до 2016 включительно ровно четыре натуральных делителя? (Включая 1 и само число)
У скольких чисел от 1 до 2016 включительно ровно четыре натуральных делителя? (Включая 1 и само число). Помогите пожалуйста !

19
 Аватар для VLaDoS_2001a
319 / 216 / 114
Регистрация: 14.05.2020
Сообщений: 890
10.10.2020, 14:58
Alexandra1234A,
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
#include <iostream>
#include <vector>
using namespace std;
 
constexpr size_t minn = 174457;
constexpr size_t maxx = 174505;
 
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
 
    size_t counter;
    vector<int>ans;
    for(size_t i = minn; i <= maxx; ++i)
    {
        counter = 0;
        ans.clear();
        for(size_t j = 2; j < i; ++j)
        {
            if(i % j == 0)
            {
                ++counter;
                ans.emplace_back(j);
            }
            else if(counter > 2) break;
        }
        if(ans.size() == 2)
        {
            for(auto&i:ans)
            {
                cout << i << " ";
            }
            cout << endl;
        }
    }
 
    cin.get();
    return EXIT_SUCCESS;
}
1
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
10.10.2020, 15:24
Цитата Сообщение от Alexandra1234A Посмотреть сообщение
Готовлюсь к КЕГЭ 2021 и пишу в основном на с++
Зачем? Есть же чудесный питон, который прекрасно подходит для обучения в школе ( да и в вузе тоже ).

Цитата Сообщение от Alexandra1234A Посмотреть сообщение
которая ищет среди целых чисел, принадлежащих числовому отрезку [174457; 174505], числа, имеющие ровно два различных натуральных делителя,
То что такие делители будут простыми числами доказывать нужно или очевидно?
В первом приближении, вам нужно для каждого числа из диапазона посчитать количество простых делителей и вывести те числа, где количество простых делителей равно 2.
C++
1
2
3
4
5
6
7
//a ,b - диапазон
for ( int n = a; n < b; n ++)
{
             vector<int> delimeters = get_prime_delimeters( n );
             if ( delimeters.size() == 2 )
                       cout << deilmeters[0] <<" "<<delimeter[1] << endl;
}
для нахождения простых делителей числа n вам нужно перебрать все возможные делители n и выбрать из них только простые:
C++
1
2
3
4
5
6
7
8
9
10
11
vector <int> get_prime_delimeters(int n )
{
        vector <int> result ;
        for (int d =2 ; d < n ; d++)
         { 
              if ( n%d == 0 ) // нашли делитель
                       if ( is_prime(d) ) // если простой, то
                              result.push_back(d);
          }
          return result;
}
ну и, помня, что простые числа делятся только на 1 и на себя, напишем функцию проверки на простоту:
C++
1
2
3
4
5
6
7
bool is_prime( int d)
{
      for ( int i =2; i < d; i++)
              if( d%i == 0 )  // делитель есть, не простое.
                      return false;
      return true;
}
Собственно все, функционально программа работает и выдает корректный (наверное - не проверял) результат.
Но вы можете задуматься, что делители любого числа лежат в диапазоне 2.. sqrt(number), и можно значительно уменьшить количество итераций в get_prime_delimeters и is_prime ограничив поиск делителей этим диапазоном. Так же, если проведена проверка делимости на 2, нет смысла проверять делимость на 4, 6, 8 и так далее - после чего сокращаете цикл еще в два раза используя вместо iterator++ приращение iterator += 2;
Убедившись, что все ваши изменения выдают прекрасные результаты, вы приходите к мысли, что вычислять делители и проверять их на простоту каждый раз вовсе не обязательно, и можно один раз посчитать все простые от 2 до sqrt(b) и искать делители чисел в get_prime_delimeters только среди вычисленных простых. И это будет третьим приближением.
В четвертом приближении выяснится, что вы решаете олимпиадные задачи и не укладываетесь по времени, потому целесообразно массив простых не вычислять (по крайней мере для простых больших 10000) а забить в программу скачав посчитанные значения из интернета.
В пятом вы захотите оптимизировать не алгоритм, а сам код - уберете передачу векторов копированием заменив на возврат ссылки или сразу указателей на пару простых из массива. А может быть добавите кеширование для близких к sqrt(b) значений простых.
1
0 / 0 / 0
Регистрация: 10.10.2020
Сообщений: 28
10.10.2020, 15:25  [ТС]
Спасибо конечно, но можно как-то попроще(на примитивном через массив например) написать код т.к знаю с++ на уровне школы и библиотеку vector не понимаю.
0
 Аватар для VLaDoS_2001a
319 / 216 / 114
Регистрация: 14.05.2020
Сообщений: 890
10.10.2020, 15:36
Alexandra1234A, vector пользовательский тип данных, обвёртка обычного динамического массива. С обычным массивом будет много мороки
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
10.10.2020, 15:41
Лучший ответ Сообщение было отмечено Alexandra1234A как решение

Решение

Цитата Сообщение от Alexandra1234A Посмотреть сообщение
Пыталась сделать через массив
массив не нужен
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 k, n, m;
    for(int i = 174457; i <= 174505; i++)    {
        k=0;        
        for(int j = 2; j < i; j++)        
            if(i % j == 0) {
            k++;          
            if(k==1) n=j;
            if(k==2) m=j;
            }
        if(k==2) cout << n << " " << m << "\n";        
    }
    
system("pause");
return 0;
}
2
0 / 0 / 0
Регистрация: 10.10.2020
Сообщений: 28
10.10.2020, 15:50  [ТС]
спасибо огромное вам!
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
10.10.2020, 16:27
Цитата Сообщение от Alexandra1234A Посмотреть сообщение
но можно как-то попроще(на примитивном через массив например)
НЕЛЬЗЯ!
На егэ вы будете соревноваться с ребятами, которые будут использовать питон. Они будут иметь динамические массивы, отображения, итераторы и строки из коробки и будут применять их не задумываясь о том, что скрыто "под капотом". Вы же собираетесь байтики перекладывать и вручную памятью управлять. Вам нужно или отказаться от си-плюс-плюс в качестве рабочего инструмента или выйти из зоны комфорта и посмотреть четыре ролика по 15 минут про vector, map, string, и какие-то базовые вещи из algorithm, либо готовиться обтекать с 30 баллами по информатике.

Добавлено через 19 минут
Чтоб вы понимали о чем идет речь. В файле большие числа через запятую. Их нужно прочитать и что-то с ними сделать, сложить, например.
Это божественный СИ на котором вы пытаетесь писать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    FILE *ifd = fopen("input.txt", "r");
    char str[100];
 
    fgets(str, sizeof(str), ifd);
 
     char* pch = NULL;
     pch = strtok(str, ",");
     a = _atoi64(pch);
 
     pch = strtok(NULL, ",");
     b = _atoi64(pch);
     
     pch = strtok(NULL, ",\n");
     c = _atoi64(pch);
 
    fclose(ifd);
а это питон, которым будут пользоваться остальные ребята:
Python
1
2
3
    with open(fname,"r") as fd:
        for line in fd.readlines():
            ai,bi,ci = line.split(",")
облажаться в первом коде значительно легче, особенно при письме по памяти.

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

Не по теме:

что-то бамбануло у меня - преподавателям которые детей учат программированию используя си нужно по жопе указкой надавать.

0
10.10.2020, 16:31

Не по теме:

это Вы о чём ?

Цитата Сообщение от Vladimir. Посмотреть сообщение
НЕЛЬЗЯ!
и если не секрет почему решили что ТС пишет на С ?
Цитата Сообщение от Vladimir. Посмотреть сообщение
Это божественный СИ на котором вы пытаетесь писать

0
0 / 0 / 0
Регистрация: 10.10.2020
Сообщений: 28
10.10.2020, 16:31  [ТС]
Спасибо, попытаюсь изучить python
0
10.10.2020, 17:04

Не по теме:

Цитата Сообщение от Yetty Посмотреть сообщение
это Вы о чём ?
О том, чтобы "попроще"
Цитата Сообщение от Yetty Посмотреть сообщение
и если не секрет почему решили что ТС пишет на С ?
Потому что отказывается от STL и хочет использовать голые конструкции из си, т.е. пытается писать на "си с классами".

0
10.10.2020, 17:20

Не по теме:

Цитата Сообщение от Vladimir. Посмотреть сообщение
О том, чтобы "попроще"
так почему нельзя ? сбросил же код в сообщении выше
Цитата Сообщение от Vladimir. Посмотреть сообщение
Потому что отказывается от STL
ну не знаю. ТС дважды повторила что пишет на С++, а Вы в разделе С++ начали обсуждать плюсы и минусы С и Python

0
 Аватар для scanf
96 / 69 / 27
Регистрация: 26.08.2020
Сообщений: 360
10.10.2020, 17:23
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
50
51
52
53
54
55
56
57
#include <stdio.h>
#include <stdlib.h>
int main(void){
    int *del=NULL;
    int **m=NULL;
    int bytes=0;
    int b=0;
    for (int i=174457;i<=174505;i++){
        del=NULL;
        bytes=0;
        for (int j=i-1;j>1;j--){
            if (i%j==0){
                bytes+=sizeof(int);
                del=(int*)realloc(del,bytes);
                del[bytes/sizeof(int)-1] = j;
            }
        }
        if (bytes/sizeof(int)!=2) continue;     
        CYCLE:
        for (int i=0;i<bytes/sizeof(int)-1;i++){
            if (del[i]>del[i+1]){
                int temp = del[i];
                del[i]=del[i+1];
                del[i+1]=temp;
            }
        }
        for (int i=0;i<bytes/sizeof(int)-1;i++){
            if (del[i]>del[i+1]) goto CYCLE;
    }
        b+=sizeof(int*);
        m=(int**)realloc(m,b);
        m[b/sizeof(int*)-1]=del; 
    }
    CYCLE2:
    for (int i=0;i<b/sizeof(int*)-1;i++){
        int first;
        int second;
        first=m[i][0]*m[i][1];
        second=m[i+1][0]*m[i+1][1];
        if (first>second) {
            int *temp = m[i];
            m[i]=m[i+1];
            m[i+1]=temp;
            }
        }
        for (int i=0;i<b/sizeof(int*)-1;i++){
        int first;
        int second;
        first=m[i][0]*m[i][1];
        second=m[i+1][0]*m[i+1][1];
        if (first>second) goto CYCLE2;
    }
    for (int i=0;i<b/sizeof(int*);i++){
        printf("%d %d\n",m[i][0],m[i][1]);
    }
    return 0;
}
0
10.10.2020, 19:21

Не по теме:

Цитата Сообщение от Yetty Посмотреть сообщение
ТС дважды повторила что пишет на С++
ТС указала, что готовится к сдаче ЕГЭ. При этом выбор инструмента, вероятно, был сделан за ТС преподавателем в школке. Инструмент и уровень владения им не годится для решения поставленной задачи, о чем и было сказано. И ТС не пишет на С++, а лишь использует его компилятор. И может быть cin и cout.
а Вы в разделе С++ начали обсуждать плюсы и минусы С и Python
Нет, не начал. Во первых обсуждать особо нечего - всё и так известно. Во вторых, просто показал пример из реального кода, хоть и несколько адаптированный, чтобы продемонстрировать разницу между тем, что будет делать ТС и тем, что будут использовать конкуренты.
Цитата Сообщение от Yetty Посмотреть сообщение
так почему нельзя ? сбросил же код в сообщении выше
Если вы посмотрите, то "код выше" использует контейнеры в зачаточном состоянии. ТС же хотел от них отказаться. Так вот как раз таки писать на плюсах и отказываться от STL нельзя - это прямой путь к низким оценкам на экзамене.

0
10.10.2020, 19:41

Не по теме:

Цитата Сообщение от Vladimir. Посмотреть сообщение
ТС не пишет на С++
Цитата Сообщение от Alexandra1234A Посмотреть сообщение
пишу в основном на с++
Цитата Сообщение от Vladimir. Посмотреть сообщение
писать на плюсах и отказываться от STL нельзя
это зависит от конкретной задачи. например в этой задаче STL ни к чему
Цитата Сообщение от Vladimir. Посмотреть сообщение
вы посмотрите, то "код выше" использует контейнеры
в коде который я сбросил (сообщение #6) контейнеров нет

0
10.10.2020, 20:19

Не по теме:

Цитата Сообщение от Yetty Посмотреть сообщение
в коде который я сбросил (сообщение #6) контейнеров нет
1) Он не читаемый,
2) Он не оптимальный.
3) Этот код не опровергает мое утверждение.
Цитата Сообщение от Yetty Посмотреть сообщение
например в этой задаче STL ни к чему
В этой задаче много раз нужны простые числа предшествующие sqrt(b). Логично их кешировать тем или иным образом. Т.е, их нужно будет хранить. Можно и маллоком конечно, но зачем, если есть вектор?

Миниатюры
Найти числа имеющие ровно два различных натуральных делителя  
0
10.10.2020, 20:42

Не по теме:

Цитата Сообщение от Vladimir. Посмотреть сообщение
Он не читаемый
не затруднит объяснить почему он не читаемый ?
Цитата Сообщение от Vladimir. Посмотреть сообщение
Он не оптимальный
здесь можно будет согласиться, так как в нём полный перебор если Вы конечно выложите более оптимальный
Цитата Сообщение от Vladimir. Посмотреть сообщение
не опровергает мое утверждение
так не считаю. пожелание ТС
Цитата Сообщение от Alexandra1234A Посмотреть сообщение
можно как-то попроще
я сбросил код попроще, без массивов. ей код подошёл. а затем Ваше сообщение
Цитата Сообщение от Vladimir. Посмотреть сообщение
НЕЛЬЗЯ!

0
10.10.2020, 21:34

Не по теме:

Yetty, я доказываю вот это утверждение:

Цитата Сообщение от Vladimir. Посмотреть сообщение
На егэ вы будете соревноваться с ребятами, которые будут использовать питон. Они будут иметь динамические массивы, отображения, итераторы и строки из коробки и будут применять их не задумываясь о том, что скрыто "под капотом". Вы же собираетесь байтики перекладывать и вручную памятью управлять. Вам нужно или отказаться от си-плюс-плюс в качестве рабочего инструмента или выйти из зоны комфорта и посмотреть четыре ролика по 15 минут про vector, map, string, и какие-то базовые вещи из algorithm
А вы какое опровергаете?

0
10.10.2020, 22:08

Не по теме:

Vladimir., если в двух словах Вы говорите НЕЛЬЗЯ (написать код попроще) хотя уже примерно час назад код попроще мной уже сброшен

ну и попутно предлагаете ТС сравнить простыню кода на С (на котором она не пишет) с кодом на Python (на котором она тоже не пишет)

я просто обратил Ваше внимание на эти моменты. предлагаю на этом дискуссию завершить.

0
10.10.2020, 23:11

Не по теме:

мир-дружба-жевачка.
это потому, что вы решаете эту задачу

Цитата Сообщение от Alexandra1234A Посмотреть сообщение
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [174457; 174505], числа, имеющие ровно два различных натуральных делителя, не считая единицы и самого числа.
А я вижу проблему тут
Цитата Сообщение от Alexandra1234A Посмотреть сообщение
Готовлюсь к К ЕГЭ 2021 и пишу в основном на с++.Т.к все разборы задач на паскале или питоне, не могу решить задачу

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

Найти все числа в диапазоне от M до N, имеющие ровно k делителей. Функция: количество делителей заданного числа
Найти все числа в диапазоне от M до N, имеющие ровно k делителей. Функция: количество делителей заданного числа Всем привет....

Найти вероятность того, что выпадут ровно 2 различных числа
Добрый вечер! Помогите пожалуйста с задачкой по теории вероятности. Никак не могу решить, мысли в голову совсем не идут. Подбросили 7...

Выписать все числа, у которых ровно 2 делителя
Из данного диапазона выписать все числа, у которых ровно 2 делителя (отличных от 1 и самого числа) язык программирования pascal

Найти количество различных чисел, которые можно получить из числа ровно за C команд
#include &lt;iostream&gt; using namespace std; int c(int x, int y) { if (x == y || y == 0) return 1; else if (y &gt; x) return 0; ...

Даны три различных натуральных числа. Найти их медиану
Даны три различных натуральных числа. Найти их медиану (то из них, которое не является ни максимумом, ни минимумом).


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru