Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/55: Рейтинг темы: голосов - 55, средняя оценка - 4.67
-5 / 0 / 0
Регистрация: 09.10.2016
Сообщений: 44

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

08.10.2017, 16:02. Показов 11389. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Натуральное число называется почти простым, если оно не простое и имеет только один простой делитель. Найти количество почти простых чисел в заданном интервале натуральных чисел.

Входные данные

Первая строка содержит количество тестов n (n ≤ 600). Каждая следующая строка является отдельным тестом и содержит два числа low и high (0 < low ≤ high ≤ 1012).

Входные данные

Для каждого теста вывести в отдельной строке количество почти простых чисел в промежутке [low...high] включительно.

Входные данные -
3
1 10
1 20
1 5
Выходные данные-
3
4
1
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2017, 16:02
Ответы с готовыми решениями:

Найти количество простых чисел в заданном интервале
По числу n найти количество простых чисел p из интервала n &lt; p &lt; 2n. Нужен быстрый способ.

С помощью метода определить количество простых чисел в заданном интервале
С помощью метода определить количество простых чисел в интервале (a – по умолчанию 1,b).

Найти первые 15 натуральных чисел, делящихся нацело на d и лежащих в заданном интервале
Даны два числа d и l. Требуется найти первые 15 натуральных чисел, делящихся нацело на d и лежащих в интервале .

29
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
09.10.2017, 23:00
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Байт Посмотреть сообщение
условие i <= i*i выполняется для всех i,
не для всех по крайней мере на компьютере
переполнение однако
C++
1
2
char x=0x7F;
char y=x*x;//y=01
квадрат меньше числа
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
10.10.2017, 10:59
Ну с этим я конечно согласен, ерунду написал
Завтра со свежой головой переосмыслю эту задачу

Добавлено через 11 часов 55 минут
Цитата Сообщение от Байт Посмотреть сообщение
Пока писал последнюю фразу, понял, что можно построить алгоритм так, что простых чисел хранить не нужно, а просто использовать по мере появления. Но сразу во всех парах границ
Как это? То есть искать числа от 2 до 1012 не надо?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.10.2017, 11:19
Цитата Сообщение от no swear Посмотреть сообщение
Как это? То есть искать числа от 2 до 1012 не надо?
Искать-то надо. Простые до 106. Но только один раз для всех 600 пар границ. Не надо их в массиве хранить. Но придется хранить сами границы (2 раза по 600).
Если у тебя не получится, набросаю попозже.

Не по теме:

Сейчас у нас в деревне кончился дождь и выглянуло солнышко. Такие моменты надо ловить. Жалко на компьютер их тратить:)

0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.10.2017, 19:50
Вот как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define LL unsigned long long
typedef struct {
  LL L, H;
  LL val;
               } LHV;
cin >> n;
LL Max;
LHV *LHV = (LHV *)malloc(sizeof(LZH)*n);
for(int i=0; i<n; i++) {
  cin >> LHV[i].L >> LUV[i].H;
  LHV[i].vfl = 0;
  if (i==0 || LHV[i].H > Max)
       Max = LHV[i].H;
}
for(LL p=2; p*p<=Max; p++) {
  if (!isPrime(p)) continue;
  for (LL pk = p*p; pk <= Max; pk *= p) {
    for(int i=0; i<n; i++) {
      if (pk >=LHV[i].L && pk <=LHV[i].H)
         LHV[i].val++;
    }
  }
}
И даже не очень сложно...
Кой-какие очевидные вещи я пропустил...
2
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
12.10.2017, 13:40
Можете поделится алгоритмом пожалуйста За код огромное спасибо но не могу представить общую картину, что там происходит?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.10.2017, 14:06
Цитата Сообщение от no swear Посмотреть сообщение
не могу представить общую картину,
Да все там простенько. Я, правда, без комментариев написал. А что именно непонятно?
Со структурой понятно? Я просто собрал в кучку все, относящееся к одной паре границ. Можно было 3 массива сделать, но мне так больше нравится.
До 14-й строки вообще все элементарно. Вводим пары границ, находим максимальную верхнюю Max.
В цикле 15-23 проверяю числа на простоту. Но каждое число проверяю ТОЛЬКО ОДИН РАЗ. Эта проверка - штука весьма затратная. Не простые, естественно, пропускаю (стр.16). Далее генерирую все pk (pk) (ведь только они претендуют на звание ПочтиПростых) и смотрю, какие из них попадают в каждую пару границ (стр.18-21), соответственно, увеличивая val. Вот эти val нам и нужны.
1
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,101
12.10.2017, 14:20
Цитата Сообщение от Байт Посмотреть сообщение
if (i==0 || LHV[i].H > Max) Max = LHV[i].H;
Раз Max - unsigned, можно было его инициализировать нулем, тогда убрать проверку на (i==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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <cmath>
 
bool isPrime(uint64_t p){
  uint64_t i, max;
  max = sqrt(p);
  for(i=2;i<=max;i++)if(p % i == 0)return false;
  return true;
}
 
typedef struct {
  uint64_t min, max; //минимальное и максимальное значения зиапазона
  uint64_t num; //количество элементов
}range_t;
 
int main() {
  int n;
  std::cin >> n;
  uint64_t max=0; //максимальное значение, которое нужно проверить
  range_t *range = (range_t *)malloc(sizeof(range_t)*n);
  //ввод диапазонов
  for(int i=0; i<n; i++) {
    std::cin >> range[i].min >> range[i].max;
    range[i].num = 0;
    if (range[i].max > max) max = range[i].max;
  }
  
  //перебор всех простых чисел от 2 до корня из максимального
  for(uint64_t p=2; p*p<=max; p++){
    if (!isPrime(p)) continue; //если число не простое - проверяем следующее
    //перебираем степени найденных чисел - от p^2 до максимального
    for (uint64_t pwr = p*p; pwr <= max; pwr *= p){
      //перебираем все диапазоны
      for(int i=0; i<n; i++){
        //если хоть какая-то степень числа попала в диапазон - это число имеет единственный делитель, тогда         увеличиваем его счетчик
        if (pwr >=range[i].min && pwr <=range[i].max)range[i].num++;
      }
    }
  }
  
  for(int i=0; i<n; i++){
    std::cout << range[i].num << std::endl;
  }
  
  free(range);
}
2
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
12.10.2017, 14:24
Цитата Сообщение от Байт Посмотреть сообщение
LHV *LHV = (LHV *)malloc(sizeof(LZH)*n);
LZH откуда взялось?
Аа по моему я понял, вы собрали все границы а потом только один раз ищите почти простые числа и те которые попадают хотя бы в одну из границ выводим Точнее увеличиваем val для данного диапазона куда это число входит
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.10.2017, 14:29
Цитата Сообщение от no swear Посмотреть сообщение
LZH откуда взялось?
Да, опечаточка.
LHV, конечно.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,101
12.10.2017, 14:46
Еще в 10 строке опечатка cin >> LHV[i].L >> LUV[i].H;, но главное что алгоритм понятен и работает быстрее прохода по диапазонам.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2017, 14:46

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

На интервале [m; n] найти количество натуральных чисел
На интервале найти количество натуральных чисел вида 3d5p (d, p - положительные целые числа).

Найти количество натуральных чисел в интервале от 1 до N
Дано натуральное число N. Найти количество натуральных чисел в интервале от 1 до N, у которых сумма цифр – простое число (единицу не...

Найти количество чисел в интервале от 1 до N, взаимно простых с N
Дано число N. Найти количество чисел в интервале от 1 до N,взаимно простых с N.

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru