powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка с дробями.
25 сообщений из 131, страница 4 из 6
Задачка с дробями.
    #38133121
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZyK_BotaN, в отбрасывании 19990 есть какая-то хитрость?

Вообще весь код работает быстрее с отбрасыванием или нет?нет. не быстрее. меня просто интересуют последние числа.

первая половина - все равно не интересна. там числитель 1, а знаменатель уменьшается.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133122
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZyK_BotaNмогу сделать такое же решение, только на си или джаве.
Нет. Не надо.а я уже было начал. ну ладно
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133125
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonпропущено...

Нет. Не надо.а я уже было начал. ну ладно но не забываем про экономию памяти.

при отбрасывании, нам нужно не 20000 единиц под результат, а только 10.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133193
ZyK_BotaNтех в таком стиле был написан кнутомИ пряником?
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133195
Это называется рядами... эээ... имени Склероза. Не помню, в общем, кого.
И строить можно примерно так:
начинаем с . Потом промеж любой пары, у которой сумма знаменателей не больше нашего максимума, вставляем дробь сумма числителей/сумма знаменателей:


.
При этом не надо проверять на несократимость. Может получиться быстрее.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133197
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смоляное ЧучелкоЭто называется рядами... эээ... имени Склероза. http://ru.wikipedia.org/wiki/Ряд_Фарея
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133229
tanglir,

Спасибо большое. Постараюсь запомнить.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133237
ZyK_BotaNпервая половина - все равно не интересна. там числитель 1, а знаменатель уменьшается
Положим, всё это симметрично относительно 1/2, так что если первые 1/n, то и хвост будет состоять из ровно стольки ж (n-1)/n.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133348
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смоляное ЧучелкоZyK_BotaNпервая половина - все равно не интересна. там числитель 1, а знаменатель уменьшается
Положим, всё это симметрично относительно 1/2, так что если первые 1/n, то и хвост будет состоять из ровно стольки ж (n-1)/n. я не правильно сказал. не половина дробей, а первые к чисел, где к - половина от н.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133356
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNСмоляное ЧучелкоZyK_BotaNпервая половина - все равно не интересна. там числитель 1, а знаменатель уменьшается
Положим, всё это симметрично относительно 1/2, так что если первые 1/n, то и хвост будет состоять из ровно стольки ж (n-1)/n. я не правильно сказал. не половина дробей, а первые к чисел, где к - половина от н.
и заметь, для примера н = 5.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5


первые элементы действительно имеют числитель 1.
а вот последние два - уже разнятся знаменателями.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133401
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смоляное ЧучелкоЭто называется рядами... эээ... имени Склероза. Не помню, в общем, кого.
И строить можно примерно так:
начинаем с . Потом промеж любой пары, у которой сумма знаменателей не больше нашего максимума, вставляем дробь сумма числителей/сумма знаменателей:


.
При этом не надо проверять на несократимость. Может получиться быстрее.

классный метод.

вроде рулит не хило.

считает элементы для н = 2024 - мгновенно.

вот код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
main = putStr $ show result

result = insert (0, 1) (1, 1)

n = 2024

insert (a1,b1) (a2,b2) | b1 + b2 > n = []
                       | otherwise = (insert (a1,b1) (a3, b3)) ++ [(a3, b3)] ++ (insert (a3,b3) (a2, b2))
                        where a3 = a1 + a2
                              b3 = b1 + b2



правда сам вывод занимает время, поэтому для бенчмарка, первую строку можно поменять на:
Код: sql
1.
main = putStr $ show $ length result
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133421
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот мне интересно, как в ghc реализована операция конкатенации(есть ли какие-то оптимизации в зависимости от контекста вычислений).

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

ведь нам по сути нужна вставка элемента в список, а вместо этого, мне приходится их канкатенировать, так как списки иммутабельны.

вернее я могу одну канкатенацию выкинуть, но она и не является накладной, так как там список состоит из одного элемента, но все же:

Код: sql
1.
(insert (a1,b1) (a3, b3)) ++ (a3, b3) : (insert (a3,b3) (a2, b2))



а вот что делать с первой канкатенацией - не знаю.

но есть не нулевая вероятность, что оптимизатор компилятора ghc понимает что от него хотят, и делает список мутабельным, так как тот виден только локально.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133571
Если не лень, попробуй такой ещё вариант:
Код: sql
1.
2.
3.
4.
5.
insert (a1,b1) (a2,b2) | b1 + b2 > n = []
                       | b1 + b2 = n = [(a3, b3)]
                       | otherwise = (insert (a1,b1) (a3, b3)) ++ [(a3, b3)] ++ (insert (a3,b3) (a2, b2))
                        where a3 = a1 + a2
                              b3 = b1 + b2


Интересно, сильно ли повлияет.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133599
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNа вот мне интересно, как в ghc реализована операция конкатенации(есть ли какие-то оптимизации в зависимости от контекста вычислений).
вот что встретил на рсдн по данному вопросу:

автор
Ладно, тогда разберемся "аналитически". Ну, короче, как в принципе устроен ++? Ну, например, так. Я на Эрланге напишу, мне так проще, и в принципе один хрен.


%% Вот это - достаточно понятно.
concat( [], X ) -> X;

%% Как, собственно, и вот это
concat( [ H | T ], X ) ->
[ H | concat( T, X ) ].



Как у нас будет выполняться concat( A, B) в ленивом языке? Для простоты, пусть у нас ленивые только конструкторы списка, остальное неважно.

C = concat( A, B ) имеет сложность O(1)

Пробежка по результату приведет к дополнительному ленивому вызову concat, который будет возвращать копию элемента списка H для каждого элемента А, и будет стоить столько же для элементов B. То есть, пробежка по С будет чуть дороже, чем пробежка по А или Б. Однако, налицо неплохой потенциал для оптимизации в ghc — компилятор может избежать задействования хипа, если выведет last use для элементов C. Это уже кое-что, не так ли?

D = concat( concat( A, B ), B1 ) — само по себе тоже O(1), разумеется, это не интересно.

А пробежка по D... Два накладных вызова на len( A ), один — на len( A + B ) — len( A ), и ноль на len( B1 ). Та же картина по last use для ghc.

Итак, при наращивании глубины конкатенации по данной цепочке, имеем очень легкую, почти незаметную в сравнении со строгим случаем квадратичность (за счет отсутствия переливаний из памяти в память), которая будет почти незаметна на фоне обработки.

Смотрим второй вариант:
D = concat( B1, concat( A, B ) )

Имеем один накладной вызов при любой вложенности подобных операций конкатенации. То есть, квадратичности нет. Прикольно, не так ли?

Будем проверять теорию экспериментом?

взято отсюда. там на тему конкатенации идет дискусс
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133678
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смоляное ЧучелкоЕсли не лень, попробуй такой ещё вариант:
Код: plaintext
1.
2.
3.
4.
5.
insert (a1,b1) (a2,b2) | b1 + b2 > n = []
                       | b1 + b2 = n = [(a3, b3)]
                       | otherwise = (insert (a1,b1) (a3, b3)) ++ [(a3, b3)] ++ (insert (a3,b3) (a2, b2))
                        where a3 = a1 + a2
                              b3 = b1 + b2

Интересно, сильно ли повлияет.
вечером погоняю с профайлером для разных случаев.

например сколько потребляется памяти, если нужно найти последних 10 из 20000. а сколько для всех 20000
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133723
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Общий порядок - неубывающая последовательность. Есть ли второй порядок сортировки? (судя по примеру, возрастающий числитель, если он не противоречит основному порядку)
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133724
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNвзято отсюда. там на тему конкатенации идет дискусс сказать то сказал, а ссылку дать забыл:
http://www.rsdn.ru/forum/decl/3389338.flat.2
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133739
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДано N (натуральное). Вывести список рациональных дробей
в неубывающем порядке где числитель и знаменатель - целые от 1 до N.
И числитель не больше знаменателя (т.е. результат дроби меньше 1.0)

Вход:
5
Выход:
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5

Меня волнует вопрос неубывающего порядка и тот факт, что все решили, будто 1/2 выводим, а 2/4 не выводим.
Если порядок НЕубывающий -это равно сильно тому, что он может как расти, так идти "ровно" ;) Ошибаюсь?
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133760
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Меня волнует вопрос неубывающего порядка и тот факт, что все решили, будто 1/2 выводим, а 2/4 не выводим. Третье и четвёртое сообщения темы.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133764
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbstractionОзверин,

Меня волнует вопрос неубывающего порядка и тот факт, что все решили, будто 1/2 выводим, а 2/4 не выводим. Третье и четвёртое сообщения темы.

Я их прочел, но суть слова "Неубывающая последовательность" для меня осталась загадкой.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133797
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Неубывающая последовательность, все члены которой различны - в чём проблема?
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133808
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинМеня волнует вопрос неубывающего порядка и тот факт, что все решили, будто 1/2 выводим, а 2/4 не выводим.
Если порядок НЕубывающий -это равно сильно тому, что он может как расти, так идти "ровно" ;) Ошибаюсь?
Это задача из книги Федор Меньшиков - Олимпиадные задачи по программированию.
Но я с тобой согласен что такая постановка где надо сокращать дроби и убирать
дубли - чем-то ограничнивает скорость генерации.

Давай, сделай так как будто-бы сокращение не обязательно. Поскольку я - топик
стартер - то имею право взять и поменять постановку.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133960
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно сказать, давно не решал олимпиданых..и совершенно забыл всю математику, но расскажу ход своих мыслей и то, к чему я пришел:

1) Максимальное значение для множества рациональных дробей , где N-числитель, M<N - знаментель = n-1/n
2) Минимальное значение для этого же множества: 1/n

Дальше, я решил построить дерево, с убывающими вершнами и убывающими ветвями:
где вершины: n-1/n -> n-2/n-1 -> n-3/n-2 ->...-> 1/2
и само собой листики веток:
где вершина n-1/n : n-2/n > n-3/n > ... > 1/n

Посмотрел на дерево, вершины всегда убывают, листики в отдельно взятой ветви всегда убывают. Как обойти дерево, чтобы выбрать с наименьшего (1/n) до наибольшего n-1/n?

В итоге(для 5, допустим)

Код: plaintext
1.
2.
3.
4.
1/2	2/3	3/4	4/5
	1/3	2/4	3/5
		1/4	2/5
			1/5

Движемся со двигом: 1/n -> 1/n-1 -> 1/n-? до значения ветви с числителем вершины целое от деления (n/2) и(соответственно) знаменателем = (целое отделения(n/2)) +1
Следующий этап 1/n -> 1+1/n такое же движение

Я видимо повторил чей нибудь велосипед или просто попал в логическую ловушку, но эмпирически вывел следующее правило обхода:



Код: java
1.
2.
3.
4.
5.
for (int i=1; i<=n; i++) {
			for (int j=n; j>=((n/2)+1); j--) {
				System.out.println(i + "/" + j);
			}
		}



Все...ничего не сохраняю, вроде.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133993
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин, покажи вывод скажем для N=16
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38134003
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

1/16
1/15
1/14
1/13
1/12
1/11
1/10
1/9
2/16
2/15
2/14
2/13
2/12
2/11
2/10
2/9
3/16
3/15
3/14
3/13
3/12
3/11
3/10
3/9
4/16
4/15
4/14
4/13
4/12
4/11
4/10
4/9
5/16
5/15
5/14
5/13
5/12
5/11
5/10
5/9
6/16
6/15
6/14
6/13
6/12
6/11
6/10
6/9
7/16
7/15
7/14
7/13
7/12
7/11
7/10
7/9
8/16
8/15
8/14
8/13
8/12
8/11
8/10
8/9
9/16
9/15
9/14
9/13
9/12
9/11
9/10
10/16
10/15
10/14
10/13
10/12
10/11
11/16
11/15
11/14
11/13
11/12
12/16
12/15
12/14
12/13
13/16
13/15
13/14
14/16
14/15
15/16
...
Рейтинг: 0 / 0
25 сообщений из 131, страница 4 из 6
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка с дробями.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]