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

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

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2014, 07:03   #11
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

ну да, нашел ошибку. вот в этом варианте (и еще 800 похожих):
0
2
1
2
1
0
1
2
2
Он упорно дает ответ по сумме:
5,000000000000000088

Поменял тип данных суммы с Double на Currency и выдал 4411 вариантов

Последний раз редактировалось maksim_serg; 16.10.2014 в 07:07.
maksim_serg вне форума Ответить с цитированием
Старый 16.10.2014, 13:36   #12
Ammat
Пользователь
 
Регистрация: 04.04.2014
Сообщений: 13
По умолчанию

Ваша версия- хорошая работа. Но мне нужен еще и макрос , так как мне неоходимо подгонять разные числа под разные суммы.Если сможете вставте во вложение.
Ammat вне форума Ответить с цитированием
Старый 16.10.2014, 13:40   #13
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

поздравляю, коллега!
несмотря на разницу во времени в 4 часовых пояса, мы смогли на разных платформах получить одинаковый результат.
я ввел в свой алгоритм точность, и если разница между значениями не превышает точность - то значения считаются одинаковыми

в начале я накосячил с алгоритмом. рекурсия - удивительная вещь. когда пытаюсь в пошаговом режиме отловить ошибку то, силясь удержать в голове все данные, я на 3-ем, 4-ом рекурсивном входе процедуры в саму себя теряю сознание... и все приходится начинать сначала

а сейчас доволен алгоритмом, который на входе получает 2 параметра заданную сумму и произвольного размера диапазон ячеек с исходными числами, на выходе, справа от диапазона, выдает варианты количества чисел для получения заданной суммы.
и все это не полных 30 строк кода. правда, для принятых 9-ти значений время расчетов составило почти 10 сек.

а автор темы получил файл со всеми 4411 вариантами))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 16.10.2014, 19:13   #14
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

мой цикл перебирает за 0.35 сек
maksim_serg вне форума Ответить с цитированием
Старый 17.10.2014, 12:31   #15
Ammat
Пользователь
 
Регистрация: 04.04.2014
Сообщений: 13
По умолчанию

Здравствуйте. Кто может поделиться кодом для моей задачи.
Ammat вне форума Ответить с цитированием
Старый 17.10.2014, 12:47   #16
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

Вариант 1 (простой):
перебираете циклом все возможные варианты значений кол-ва каждой детали. Суммируете, сравниваете с заданной площадью, если равны - один из вариантов.
maksim_serg вне форума Ответить с цитированием
Старый 19.10.2014, 14:46   #17
Ammat
Пользователь
 
Регистрация: 04.04.2014
Сообщений: 13
По умолчанию

Здравствуйте. Да , для специалиста этот вариант простой. Но не для меня.
Ammat вне форума Ответить с цитированием
Старый 19.10.2014, 15:35   #18
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Dim s0 As Double, k As Long, rg As Range, r As Double, e As Double

Sub Start()
  Dim c, s
  s0 = [a2]:  Set rg = [c2:c10]:  s = WorksheetFunction.Transpose(rg.Value)
  ReDim c(1 To UBound(s)): r = s(1): k = 1: e = 0.001 ^ 2: Calc s, c, UBound(s)
  MsgBox "см. левый нижний угол окна Ексел. там к-во вариантов":  Application.StatusBar = False
End Sub

Sub Calc(ByVal s, ByVal c, n)
  Dim i As Long, cr As Double
  c(n) = Int((s0 - SP(s, c)) / s(n) + e): cr = Round(s0 - SP(s, c), 3)
  If cr <= r Then r = cr: rg.Offset(0, k) = WorksheetFunction.Transpose(c)
  If cr ^ 2 < e Then k = k + 1: Application.StatusBar = k
  If n = 1 Then Exit Sub
  If c(n) = 0 Then
    Calc s, c, n - 1
  Else
    For i = 0 To c(n)
      If cr >= s(1) Then Calc s, c, n - 1
      If c(n) > 0 Then c(n) = c(n) - 1: cr = s0 - SP(s, c)
    Next
  End If
End Sub

Function SP(s, c) As Double
  Dim p As Double, i As Long
  For i = 1 To UBound(s):  p = p + s(i) * c(i):  Next
  SP = p
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 19.10.2014, 16:06   #19
Ammat
Пользователь
 
Регистрация: 04.04.2014
Сообщений: 13
По умолчанию

Большое спасибо!!! То что надо.
Ammat вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подбор слагаемых для нужной суммы bank_notes Microsoft Office Excel 3 14.11.2013 14:14
Сумма с увеличением числа слагаемых Dasharnb777 Microsoft Office Excel 4 05.03.2013 11:27
Сумма N слагаемых (Delphi) Начинающий програм Помощь студентам 10 28.09.2012 16:06
Разбиение натурального числа на 3 слагаемых Neitrosha Помощь студентам 13 27.10.2010 18:45
вывод слагаемых совершенного числа fs444 Общие вопросы C/C++ 4 24.03.2010 23:04