Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
25.03.2005, 16:54
|
|||
|---|---|---|---|
|
|||
Как найти сумму чисел. |
|||
|
#18+
Есть таблица (N) с полем (num, n, 2 ) там энное число цыфр. Как мне найти те цыфры которые в сумме будут = 3333? Тоесть они могут складывать из 2, 3 и n значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.03.2005, 17:05
|
|||
|---|---|---|---|
|
|||
Как найти сумму чисел. |
|||
|
#18+
Если таблица фоксовская, то пробелм меньше. Пишем функцию Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.03.2005, 17:06
|
|||
|---|---|---|---|
|
|||
Как найти сумму чисел. |
|||
|
#18+
В процедуре SumDigitsInNumber(tnNumber) забыл строку return lnSum ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.03.2005, 17:20
|
|||
|---|---|---|---|
Как найти сумму чисел. |
|||
|
#18+
нуно найти один набор или все наборы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.03.2005, 17:26
|
|||
|---|---|---|---|
|
|||
Как найти сумму чисел. |
|||
|
#18+
Нето. Надо чтобы например 1, 20, 21, 45, 100, 127. в сумме были равны 3333. А тут чото нето. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.03.2005, 17:34
|
|||
|---|---|---|---|
|
|||
Как найти сумму чисел. |
|||
|
#18+
надо найти 1-н вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.03.2005, 17:42
|
|||
|---|---|---|---|
Как найти сумму чисел. |
|||
|
#18+
Вы гарантируете чтонабор там есть??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.03.2005, 17:46
|
|||
|---|---|---|---|
|
|||
Как найти сумму чисел. |
|||
|
#18+
Да 101% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.03.2005, 18:12
|
|||
|---|---|---|---|
Как найти сумму чисел. |
|||
|
#18+
Серж-1Тоесть, приблизительно +-1,2. не более. Уточни вопрос - тебе нуно штоб по одному полю выбрать весе значения 3333+-1,2 тогда select ... - первое значение тогда locate for ... - при наличии индекса seek ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.03.2005, 18:19
|
|||
|---|---|---|---|
Как найти сумму чисел. |
|||
|
#18+
рекурсия бы упростила задачу но кажеться в фоксе нет рекурсии не охота перебор программировать в конце рабочего дня а так в принципе более менее ясно выбрате то что пролазиет в курсор взять самое большое и повторить при неудаче вычеркнуть это число взять самое большое из оставшихся и т.д. а вообще зачем тебе всё это нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.03.2005, 16:57
|
|||
|---|---|---|---|
|
|||
Как найти сумму чисел. |
|||
|
#18+
Hi Серж-1! Блин, ну ты конечно задал вопрос. Сам то понимаешь с первого раза свою постановку %) Попробуем так: Дана таблица test (nID I, num N(10,2)) содержащая кучу записей с различными значениями поля num (nID это последовательные "номера записей"). Требуется выбрать из этой таблицы некоторое множество записей, так чтобы в нём сумма полей num составляла 3333+/-2. Теперь можно и решение предлагать :) P.S. начать стоит с того, что: 1) В общем случае задача может: а) Не иметь решения (например все num равны 1000 и "наилучшее" приближение это сумма=3000 что не попадает под условие) б) Иметь одно или более решений. 2) Грубым перебором всех возможных комбинаций задача конечно решается, но за ОЧЕНЬ большое время (советую обратится к комбинаторике и посмотреть на факториал - ибо число всевозможных выборок из N записей это N! - уже для 100 записей это число со 157 знаками!) - т.е. явно никто не доживёт до завершения расчёта. 3) Алгоритмов "интеллектуальной" выборки может быть создано МНОГО - все они будут иметь разную эффективность, и НЕ все будут способны найти правильное решение (например предложенный leaf алгоритм на первый взгляд гарантирует нахождения верного решения, но весьма и весьма неэффективным способом). 4) Если задача будет "слегка изменена" и нужно будет не "из всего массива насобирать на 3333", а скажем "разбить массив на подмножества, в каждом из которых сумма элементов задана отдельно" - тогда это будет СОВСЕМ другая задача, и совсем иными методами решаемая. P.P.S. Что-то мне это напоминает задачу "раскидать N платёжных документов по M договорам" - там обычно существует одно КАРДИНАЛЬНОЕ упрощение - одну "сумму платежа" можно распределить на 2 (а иногда и больше) "договора" - т.е. всё решается банально. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.03.2005, 00:56
|
|||
|---|---|---|---|
Как найти сумму чисел. |
|||
|
#18+
To Серж-1: Действительно, похоже на раскидывание платежных сумм по документам. Но если рассматривать математически именно предоставленную вами таблицу, то можно попытаться что-то порешать. А именно: Для приведенной вами таблицы (143 записи), 126 из которых не превышают заданного предела суммы, максимально допустимое количество слагаемых для достижения заданной суммы равно 59 (m.kol_max см.ниже) (очевидно, что максимум количества слагаемых может достигаться только при сложении наименьших из имеющихся значений NUM). Минимальное количество слагаемых - 2, раз в таблице нет значения NUM, которое "в одиночку" удовлетворяло бы заданному значению суммы. Исходя из таких граничных условий уже можно кое-что подсчитать. Максимальное количество возможных вариантов - действительно велико: Сочетаний_из_126_по_59 + Сочетаний_из_126_по_58 + ... Сочетаний_из_126_по_2 = ~5,33Е+39. Вычислений не привожу - простая комбинаторика, к делу не относится. Можно сказать только, что перебрать такое количество вариантов - никаких компутеров не хватит. А если учесть, что для анализа такого объема информации его сначала нужно где-то разместить - на это понадобится более 4,96Е+30 Гб! К сожалению, у меня такого ВИНТА нету под рукой, поэтому попытался решить вашу задачку путем сохранения промежуточной суммы как начальной для каждой последующей итерации. Не уверен, что получаемый результат охватывает ВСЕ возможные варианты, но полученных вариантов - вполне достаточно. Судите сами: SET DECIMALS TO 2 && Таблица для накопления вычисляемых сумм и их слагаемых CREATE TABLE sumy (sym n (7,2),sostav m(4)) && Допустимая погрешность. Я задал такую. m.pogr=0.06 && Выборка тех NUM, которые не превышают заданного предела && и их сортировка для упорядоченного перебора вариантов сложения SELECT num FROM n WHERE num<3333+m.pogr ORDER BY 1 INTO ARRAY nn m.sums=0 && Переменная текущей вычисленной суммы i=1 && Переменная индекса массива && Очевидно, что для вычисления МАКСИМАЛЬНО ВОЗМОЖНОГО количества слагаемых && необходимо суммировать их, начиная с наименьших (i=1, ведь данные отсортированы) DO While m.sums<3333+m.pogr m.sums=m.sums+nn i=i+1 ENDDO m.kol_max=i && Максимальное количество слагаемых && Перебор значений массива удобнее вести "снизу" - с наибольшего элемента, && добавляя к нему значения, начиная с наименьших элементов, && тогда "точка встречи" и будет окончанием перебора значений FOR t=ALEN(nn) TO m.kol_max STEP -1 && Цикл для каждого АНАЛИЗИРУЕМОГО элемента массива m.sums=nn[t] && При переборе "снизу" - это начальное значение суммы (для каждого очередного элемента массива) i=1 && Цикл для определения максимально возможного количества слагаемых && для данного элемента массива, чтобы сумма не превышала требуемую DO WHILE m.sums<3333+m.pogr m.sums=m.sums+nn i=i+1 ENDDO m.kol_iter=i-1 && Вычисленное в цикле значение максимального количества слагаемых m.sumprom=0 && Вспомогательная переменная для запоминания результатов предыдущих вариантов суммирования FOR j=1 TO m.kol_iter && Цикл перебора нарастающего количества слагаемых для данного очередного [t] элемента массива m.sumprom=IIF(j=1,nn[t],m.sumprom+nn[j-1]) && Запоминание предыдущей суммы элементов && m.strn - переменная для запоминания в символьном виде выражения суммы перебранных элементов m.strn=IIF(j=1,ALLTRIM(STR(nn[t],7,2)),m.strn+'+'+ALLTRIM(STR(nn[j-1],7,2))) m.sums=m.sumprom && Начальное значение суммы после добавления очередного слагаемого i=j && Начальное значение очередного НОВОГО добавляемого элемента-слагаемого (ведь выше - добавляся [j-1]-ый элемент) && Цикл перебора сочетания новых "далее расположенных" элементов с предыдущим набором элементов, сумма которых сохранена в m.sumprom DO WHILE m.sums<3333+m.pogr m.sums=m.sumprom+nn IF BETWEEN(m.sums,3333-m.pogr,3333+m.pogr) && Если сумма "попадает" в допустимый диапазон - запись данного варианта сложения в файл sumy.dbf m.strn=m.strn+'+'+ALLTRIM(STR(nn,7,2)) INSERT INTO sumy (sym,sostav) VALUES (m.sums,m.strn) ENDIF i=i+1 ENDDO && Досрочное завершение перебора, если сумма уже превышает домустимый предел IF BETWEEN(m.sums,3333-m.pogr,3333+m.pogr) LOOP ENDIF ENDFOR ENDFOR && Выборка допустимых сумм и их составляющих(memo) SELECT * from sumy WHERE ABS(EVALUATE(CHRTRAN(ALLTRIM(sostav),',','.'))-3333)<m.pogr ORDER BY sym К сожалению, в выборку попадают и "зеркальные"(симметричные) наборы слагаемых, видимо, не совсем верно выбран критерий выхода из цикла или "точка встречи" для четного количества элементов массива. Но, думаю, такое дублирование результатов не столь важно в данном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=41&mobile=1&tid=1594546]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
25ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 351ms |

| 0 / 0 |
