Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712

Алгоритм расчета целых чисел

29.06.2015, 21:18. Показов 3035. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Имеется матрица. Сумма всех членов в этой матрице равна К. Необходимо вычислить значение каждого члена матрицы так, чтобы сумма была равна целому числу Т и при этом каждый член матрицы тоже был целым числом, минимально отличающимся от исходного значения.

Если бы не было условия целости новых значений членов матрицы, то для вычисления этих значений нужно было бы применить формулу:
https://www.cyberforum.ru/cgi-bin/latex.cgi?{A}_{nm}=\frac{T{A}_{nm}}{K}

Однако при этом члены матрицы получаются не целыми числами.

Как сделать расчет (если это вообще возможно), чтобы члены матрицы были целыми числами?

P.S. Изначально члены матрицы не целые числа.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2015, 21:18
Ответы с готовыми решениями:

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

Алгоритм поиска целых простых чисел
Предлагаю простой алгоритм проверки и поиска простых чисел, приглашаю к сотрудничеству в написании программы для его реализации,...

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

31
1979 / 835 / 115
Регистрация: 01.10.2012
Сообщений: 5,187
Записей в блоге: 2
06.07.2015, 11:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от d7d1c Посмотреть сообщение
подскажите пошагово как округлить значения нижеприведенной матрицы:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}6,42&11,47\\ 1,83&80,28\end{bmatrix}
1) Округляем по-бухгалтерски, в ближайшую сторону
6 11
2 80
2) Сумма 99. delta = 1. Вычисляем факторы ошибок, напр для первого числа 6.42
((6.42 - 6 - delta) / 6.42) ^ 2 - ((6.42 - 6) / 6.42) ^ 2
3) Среди всех факторов находим наименьший, к этому числу прибавляем delta и корректируем фактор для этого числа. Так пока сумма не станет равной заданной
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,913
06.07.2015, 16:56
Дано: { 6.42, 11.47, 1.83, 80.28 }, сумма 100

1. Округляем в ближайшую сторону.
{ 6, 11, 2, 80 }

2. Проверяем сумму.
Сумма 99

2.а. Если сумма совпадает, то готово - выходим.

3. Вычисляем знак разницы
dif = +1 // может быть +1 или -1


Наш критерий:
Минимизировать f(n,d) = [(n - d)/d]^2;

4. Пробуем изменить на dif каждое из чисел, и смотрим, как изменится "ошибка": f(n+dif, d) - f(n, d)
Находим такое число, для которого ошибка изменится меньше всего.
Изменяем найденное число на dif.

5. Повторяем пункт 4, пока суммы на станет равна заданной.

Добавлено через 14 минут
Igor3D,
Упс! Не видел Вашего сообщения, когда писал своё...
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
08.07.2015, 20:16  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
Среди всех факторов находим наименьший, к этому числу прибавляем delta
А если у меня большая матрица и delta получилась, например, 50. При этом еще получилось так, что у какого-то члена матрицы фактор ошибки равен 0. По Вашему алгоритму я должен к этому члену прибавить 50...
Наверное Вы ошиблись (не в упрек Вам). Я понимаю так, что к этому числу надо прибавить 1, уменьшить на 1 delta и пересчитать фактор ошибки. Если delta не равно 0, то снова находим самый наименьший фактор и т. д. Верно?

Пока писал сообщение, возник следующий вопрос. Мы округляем "по-бухгалтерски". В результате может получится так, что сумма членов округленной матрицы будет больше, чем требуемая сумма. Тогда delta, соответственно, будет отрицательна. В этом случае, как я понимаю, так же ищем минимальный фактор ошибки, но член матрицы увеличиваем не на 1, а на -1, то есть уменьшаем его, а delta увеличиваем на 1. Правильно я думаю?

Добавлено через 4 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
4. Пробуем изменить на dif каждое из чисел, и смотрим, как изменится "ошибка": f(n+dif, d) - f(n, d)
Находим такое число, для которого ошибка изменится меньше всего.
Изменяем найденное число на dif.
А так понимаю, что здесь та же ошибка, что и в сообщении от Igor3D, То есть, надо менять число не на dif, а на 1 (или -1).

P.S. Чего то одна и та же ошибка у разных людей... Может я не прав?.. Или эти люди просто применительно к моей задаче писали алгоритм, а я рассуждаю в общем случае.
0
1979 / 835 / 115
Регистрация: 01.10.2012
Сообщений: 5,187
Записей в блоге: 2
09.07.2015, 10:46
Цитата Сообщение от d7d1c Посмотреть сообщение
А если у меня большая матрица и delta получилась, например, 50. При этом еще получилось так, что у какого-то члена матрицы фактор ошибки равен 0. По Вашему алгоритму я должен к этому члену прибавить 50...
Никто такого не предлагал, см выше
Цитата Сообщение от Igor3D Посмотреть сообщение
int delta = (sumInt > T) ? -1 : 1; // выясняем нужно ли уменьшать или наоборот
Т.е. delta или +1 или -1. Иначе зачем нам цикл, прибавили бы 50, и все. См также
Цитата Сообщение от Shamil1 Посмотреть сообщение
3. Вычисляем знак разницы
dif = +1 // может быть +1 или -1
И факторы ошибок всегда ненулевые. Поэтому возможно какой-то эл-т округлился идеально, но именно его надо менять.

А поиск ошибок - дело хорошее, но начинать надо с себя
1
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
09.07.2015, 11:53  [ТС]
Igor3D, извините, только что понял. Просто в моем примере сумма была 99, а надо 100. Вот я и подумал, что delta находили разницей между требуемой суммой и той, что есть. Я прошу прощения, конечно, и не пытаюсь искать ошибки. Я пытаюсь понять принцип.
Спасибо всем за помощь. Буду реализовывать в программе.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,913
09.07.2015, 17:01
Фактор ошибки может быть равен нулю.
Условие: Дробная часть числа ровно 0.5 и дельта имеет "нужный" знак (+1, если число было округлено вниз, и наоборот).

Элементы с нулевым фактором идеально подходят для "переокругления".
1
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
09.07.2015, 20:02  [ТС]
Реализовал алгоритм на VBA в Exсel. Начал пробовать округлять. И сразу же возникли вопросы по 2-м ньюансам.

1. При нахождении округленного значения с минимальным фактором ошибки может возникнуть такой случай, когда в матрице будет 2 и больше членов, для которых фактор ошибки абсолютно одинаков. Как мне кажется, в таком случае необходимо из всех членов с одинаковым фактором ошибки (и одновременно самым малым из всех остальных членов матрицы) выбрать тот, который имеет самое большое по модулю значение, так как его увеличение (уменьшение) на 1 в процентном отношении будет самым малым. Если же будет несколько членов еще и с одинаковым значением, то можно выбрать любой из них.

2. В исходной матрице могут быть члены со значением равным 0. Для них вычислить фактор ошибки нельзя, ибо делить на 0 нельзя. Как я думаю, данные члены матрицы не должны участвовать в "подгонке" значений.

Подскажите, я правильно решил данные особенности?
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,913
09.07.2015, 21:31
2. Нули не трогаем. Для них фактор ошибки - бесконечность.

1. Любой. Изменяем на 1 мы не начальное число, а округлённое, которое само отличается от начального.
Например. Мы округлили 10.4 до 10. Теперь мы изменяем 10 на 11. Раньше у нас число отличалось на 0.4, теперь будет отличаться на 0.6. Разница 0.2 всего, а не 1.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
10.07.2015, 08:00  [ТС]
По второму вопросу все ясно. По первому остались вопросы (прошу прощения за тавтологию).

Я понимаю, что мы изменяем не начальное число, а уже округленное, то есть уже измененное. Но ведь в начальной матрице наряду с дробными числами могут быть целые. После округления членов такой матрицы, эти ее изначально целые числа останутся без изменений. Соответственно, фактор ошибки для них будет 0. И тут вопрос: какой из членов матрицы с фактором ошибки 0 нужно изменять?

Shamil1, может я не понял Вас, но вы говорите, что любой такой член можно изменить. А ведь такими членами могут быть числа 1 и 100. Как мне кажется, логичнее и правильно изменить число 100, так как это изменит его на 1%, в то время как изменение числа 1 изменит его на 100%.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,913
10.07.2015, 08:13
Цитата Сообщение от d7d1c Посмотреть сообщение
эти ее изначально целые числа останутся без изменений. Соответственно, фактор ошибки для них будет 0
Нет. Фактор ошибки для них будет большой. Для одинаковых по модулю числе фактор ошибки зависит от близости числа к "середине". Подставьте в формулу 5.5 и 5.0 и посчитайте вручную на листочке, чтобы Вам стало понятней.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
10.07.2015, 08:59  [ТС]
Почему для них фактор ошибки большой? Был член начальной матрицы А = 5. После округления он не изменился: B = 5. Находим фактор ошибки: F = ((A - B) / A)^2 = ((5 - 5) / 5)^2 = 0.
0
1979 / 835 / 115
Регистрация: 01.10.2012
Сообщений: 5,187
Записей в блоге: 2
10.07.2015, 09:49
Цитата Сообщение от d7d1c Посмотреть сообщение
Почему для них фактор ошибки большой? Был член начальной матрицы А = 5. После округления он не изменился: B = 5. Находим фактор ошибки: F = ((A - B) / A)^2 = ((5 - 5) / 5)^2 = 0.
Это "сама ошибка", а "фактор" - это насколько она изменится если подгонять число, для "идеально округленных" он самый большой и выходит.

Об этом уже не раз говорилось выше, с примерами, будьте внимательны и не злоупотребляйте доверием отвечающих. Вообще здесь всех делов на полчаса, пыхтение и обширная дискуссия ни к чему. Умолкаю.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.07.2015, 09:49

Алгоритм расчета количества дней
Приветствую! Существует ли готовый алгоритм расчета количества дней между двумя датами? Проще говоря - сколько дней между 2 датами, без...

Программа расчета квадрата двух целых чисел
Создать программу расчета квадрата двух целых чисел, объявленных как переменные.

Написать программу расчета квадрата двух целых чисел
Программа расчета квадрата двух целых чисел, обьявленных как переменные

Составьте программу, которая содержит оператор while, для расчета суммы целых чисел в диапазоне от а до b
Здравствуйте. Сломал голову, перерыл форумы, но ничего дельного не нашел. Будьте добры помочь)

Алгоритм обработки целых чисел
помогите решить задачу по Visual Delphi Определить, сколько в записи числа нулей.


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru