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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2015, 12:35   #1
Giddeon
 
Регистрация: 27.11.2013
Сообщений: 5
По умолчанию Задача о пропорциях

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

понятное дело, что нужно сначала сложить все числа и лимит поделить на их сумму, так мы получим коэффициент пропорции, но после умножения чисел на этот коэффициент однозначно будут возникать знаки после запятой, и какие числа стоит округлять в большую сторону, а какие в меньшую - вопрос. Может есть какое-то правило, описывающее данную проблему?
Giddeon вне форума Ответить с цитированием
Старый 14.05.2015, 14:08   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в порядке бреда - сортируем все полученные дробные числа (то, что Вы называете "части чисел") по убыванию дробной части
потом берём первое число из списка (у него максимальная дробная часть) и округляем в большую сторону, потом берём последнее число из списка (у него минимальная дробная часть) и округляем в меньшую сторону.
потом берём второе сверху, потом второе снизу и т.д. Считаем сумму всех этих округлённых чисел.
продолжаем процесс, пока не останется ОДНО число (либо середина списка, либо первое число от середины - в зависимости от того, нечетное или чётное число чисел было).
Величину последнего числа принимаем как ЛИМИТ минус СуммаВсехРанееОкруглённых.

на мой взгляд, это даст минимально возможную погрешность.

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

p.p.s. очевидно, что всё равно будут "плохие" случаи, когда потеря точности будет весьма значительна!

Последний раз редактировалось Serge_Bliznykov; 14.05.2015 в 14:10.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2015, 14:43   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А можно пример?
Poma][a вне форума Ответить с цитированием
Старый 14.05.2015, 16:42   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
А можно пример?
мне тоже интересно посмотреть на пример!

но я покажу пример той задачи, которую я понял со слов ТС и попытался решить.
Пусть дано лимит число 9.
Пусть даны три числа 10, 15, 19
нужно от них взять части пропорционально этим числам так, чтобы сумма частей точно давала 9
Важно. Части - это целые числа.

решение.
находим сумму чисел = 44
пропорция 9/44 = 0,204545454545455
умножаем числа на пропорцию, получаем:
получаем числа:
2,04545454545455
3,06818181818182
3,88636363636364
(кстати, Excel считает, что если эти три числа сложить, получится РОВНО 9.0000000000000)

я предлагаю эти числа округлить так:
2
3
4


а теперь попробуйте то же самое сделать
для тройки чисел 22, 22, 40
для тройки чисел 22, 22, 30

Последний раз редактировалось Serge_Bliznykov; 14.05.2015 в 16:47.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2015, 18:26   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А переходящий остаток, что бы не сортировать? Берем 1-ое число, не важно в какой последовательности, округляем, разницу между округленным и исходным прибавляем ко-второму, округляем и т.д. Так часто поступаю во всяких спецификациях. На счет максимально равной пропорции без понятия
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.05.2015 в 18:34.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC kimberly Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 17:03
задача на структуру(struct)/задача на работу с файлом SevenArth Помощь студентам 0 26.04.2012 19:06
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel Toofed Помощь студентам 0 30.11.2011 01:12
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51