Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2011, 11:33   #1
Nikita++
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 80
По умолчанию Деление

Привет!!!

Есть ли какой-нибудь алгоритм, чтобы определить сколько чисел в диапазоне не делятся ни на одно из данных чисел( чисел группы )?

(Диапазон всегда от 1);

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

Реализация или на Delphi или математически. Перебор не нужен.

Жду. Заранее спасибо!!
Nikita++ вне форума Ответить с цитированием
Старый 18.03.2011, 11:37   #2
danekne
Форумчанин
 
Регистрация: 12.02.2007
Сообщений: 360
По умолчанию

Сильно сомневаюсь. Единственное подобное, что в голову приходит - это решето Эратосфена
danekne вне форума Ответить с цитированием
Старый 18.03.2011, 12:22   #3
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
По умолчанию

Создаете массив булевых по величине диапазона.
Потом закрываете с шагом равным n-ному элементам группы значением true. (напр. каждый 11-й, каждый 14...)
Может так? + проверка дубляжей элементов в группах.

Булевый массив - это быстро false-true.
А основная нагрузка - найти дубляжи в группах

Последний раз редактировалось Turbine; 18.03.2011 в 12:24.
Turbine вне форума Ответить с цитированием
Старый 18.03.2011, 12:29   #4
Turbine
Пользователь
 
Регистрация: 13.08.2008
Сообщений: 76
По умолчанию

А если есть 1, то досрочно пишем "Bingo!"
Turbine вне форума Ответить с цитированием
Старый 18.03.2011, 13:47   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Есть ли какой-нибудь алгоритм, чтобы определить сколько чисел в диапазоне не делятся ни на одно из данных чисел( чисел группы )?
(Диапазон всегда от 1);
только идея

есть число M (группа из одного числа).
узнать сколько чисел от 1 до N не делятся на M.

я правильно понял задачу (для группы из одного числа)?

представим диапазон 1..N в виде двух диапазнонов
[1..M] [M+1 ... N=M*k+r]
[1..M] [M+1..M*2]..[M*k..M*k+r]
считаем число нужных символов в каждом.

есть два числа M1 и М2
узнать с сколько чисел от 1 до N не делятся ни на M1 ни на М2.
[1..НОК(M1,M2)] ..
и далее аналогично случаю с одним числом.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 18.03.2011, 14:26   #6
Nikita++
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 80
По умолчанию

Не совсем так. Но НОК и НОД не подходят - чисел слишком много. Идея с булевым массивом мне понравилась больше, но все равно дольше лимита.
Nikita++ вне форума Ответить с цитированием
Старый 18.03.2011, 15:30   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Я так понимаю, эти числа заносятся не в ручную, а при помощи какого-то устройства по сбору данных?
Если так, то возникают вопросы:
- какова разрядность этого числа?
- какова скорость потока чисел?
Ответьте на них пожалуйста.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 18.03.2011, 18:35   #8
Nikita++
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 80
По умолчанию

Тестирует сервер, подробностей не знаю. А зачем?
Nikita++ вне форума Ответить с цитированием
Старый 19.03.2011, 18:56   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

переходим в систему счисления построенную на коэффициентах простых множителей.
M =2^k1 * 3^k2 * 5^k3 * .... (разложение на простые)
строим таблицу коэфф для всех чисел группы.
M1-> K1[]
M2-> K2[]
.....

1. M2 делится на M1 <=> k2[i]<=k1[i] для всех i
2. M1 делится на M2 <=> k2[i]>=K1[i] для всех i
3. M1 M2 взаимно просты <=>
есть i такое что K2[i]>K1[i] нарушено условие 1.
и есть j такое что K2[j]<K1[j] нарушено условие 2.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деление 0479 Общие вопросы по Java, Java SE, Kotlin 1 08.11.2010 00:37
Деление в C++ Bumbuk Помощь студентам 5 24.06.2010 02:06
Деление в С++ Tanilita Общие вопросы C/C++ 5 26.02.2010 17:28
Деление |{ot Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 24.03.2009 01:50
деление natasha Общие вопросы Delphi 6 22.01.2007 12:39