Имя: Пароль:
1C
1С v8
Задачка: в 1С Разбить число на примерно равные ЦЕЛЫЕ числа
,
0 elena_schleht
 
28.06.13
14:38
Нужно придумать механизм, который будет разбивать некую сумму на количество месяцев, так чтобы помесячные суммы были целыми числами т.е. без запятой.
Пример:
сумма - 10000
кол-во мес. - 24
Итого: 10000=(16 раз по 417)+(8 раз по 416)
Если же 10000 поделить на 24 месяца, то получим 416,6666666666667 в месяц.
1 Aprobator
 
28.06.13
14:40
Деление с остатком.
2 newfantom
 
28.06.13
14:40
кури распределение затрат
3 Aprobator
 
28.06.13
14:41
*упал под стол*
4 Alpen906
 
28.06.13
14:41
Делим на цело на количество месяцев. Остаток прибавляем к последнему месяцу.
5 kosts
 
28.06.13
14:41
Всю сумму разделить на 24.
Округлить, присвоить первому месяцу.
Уменьшить период на один.
Перейти к первому шагу.
6 АнжелаДэвис
 
28.06.13
14:42
кредитный калькулятор?
7 elena_schleht
 
28.06.13
14:43
(6) типо да ))
8 Жан Пердежон
 
28.06.13
14:44
FLOOR(1000/24) = 416
10000 - 416* 24 = 16
итого 16 * 417 + (24-16)* 416
9 sda553
 
28.06.13
14:46
Я эту задачку решаю всегда когда шторку на кючки вешаю
Решение,
1 отрезок Делим длину на количество отрезков, если дробная часть больше или равна 0.5 то округляем до верхнего иначе до нижнего
2 отрезок Делим оставшуюся длин (длина - первый отрезок) на (количество-1) если дробная часть больше или равна 0.5 то округляем до верхнего иначе до нижнего
3 отрезок Делим оставшуюся длин (длина - первый отрезок-второй отрещок) на (количество-2) если дробная часть больше или равна 0.5 то округляем до верхнего иначе до нижнего

Последний отрезов =Длина-Все отрезки до последнего
10 acsent
 
28.06.13
14:48
(4) не совсем так. Если 100 месяцев и остаток 49, то в последнем будет на 49 больше
11 АнжелаДэвис
 
28.06.13
14:49
(9) у шторки должны быть пришиты петельки для того, чтобы не решать каждый раз задачку
12 NcSteel
 
28.06.13
14:50
(0) В любой типовой есть необходимая процедура.
13 NS
 
28.06.13
14:54
Для а=0 по колво-1 цикл
 дельта=окр(сумма/(колво-а),0);
 Сообщить(дельта);
 Сумма=Сумма-дельта;
КонецЦикла;
14 sda553
 
28.06.13
14:59
(11) Так в том то и дело - петелек 100 а крючков 37
вот и решай задачу о разбиении на примерно одинаковые 36 отрезков
15 acsent
 
28.06.13
15:10
остаток нужно по единичке раскидывать по порядку или случайно можно
16 elena_schleht
 
28.06.13
15:13
(13) Вариант прикольный, но суммы не сортируются т.е. сначала идет 9 раз по 417 потом 416 и идет чередование 417 416
(15) по порядку сначала чуть больше потом чуть меньше
17 acsent
 
28.06.13
15:14
(16) целыми же. Меньше 1 нельзя. И остатка на всех не хватит
18 NS
 
28.06.13
15:16
(16) А отсортировать это очень тяжело?
Если вместо окр() сделать цел() - то будут отсортированы.
19 NS
 
28.06.13
15:16
Если нужно сначала больше, тогда цел(0.999999999999+)
20 Serg_1960
 
28.06.13
15:18
Жан уже дал ответ в (8) Об чём далее спорим? О смысле жизни без петелек на шторах?
"Общество, в котором нет цветовой дифференциации штанов, лишено цели"(Кин-дза-за)
21 Жан Пердежон
 
28.06.13
15:18
кстати, фотки нет, зачем помогаем, что за беспредел?)
22 Serg_1960
 
28.06.13
15:20
Вот что пятница делает - совсем распоясались, приличия забыли. Без фотки - и помогают :)
23 elena_schleht
 
28.06.13
15:20
(21) от парни... Им ток фотку дай...
Вы только за фотки помогаете? ))
24 elena_schleht
 
28.06.13
15:26
Может как нибудь позже и поставлю, если будете себя хорошо вести )))

Всем спасибо!
Выбрала такое решение:
Для а=0 по СрокКредитования-1 цикл
       ДатаНач = ДобавитьМесяц(ДатаНач, 1);
       НоваяСтрока = Объект.ГрафикПогашения.Добавить();
       НоваяСтрока.Дата = ДобавитьМесяц(ДатаНач, -1);
       
       СуммаПлатежа = Цел(0.999999999999+Сумма/(СрокКредитования-а));
         НоваяСтрока.СуммаПлатежа = СуммаПлатежа;
         Сумма=Сумма - СуммаПлатежа;
КонецЦикла;
25 Aprobator
 
28.06.13
15:30

// получим неделимый остаток
Остаток = СуммаКРаспределению%ЧислоОбъектовРаспределения;
БазоваяСуммаРаспределения = (СуммаКРаспределению - Остаток)/ЧислоОбъектовРаспределения;

МассивЗначений = Новый Массив(ЧислоОбъектовРаспределения);
Для ИндексМассива = 0 По ЧислоОбъектовРаспределения - 1 Цикл
   МассивЗначений[ИндексМассива] = БазоваяСуммаРаспределения;
КонецЦикла;

Пока Остаток <> 0 Цикл
    Для ИндексМассива = 0 По ЧислоОбъектовРаспределения - 1 Цикл
   МассивЗначений[ИндексМассива] =
   МассивЗначений[ИндексМассива] + 1;
   Остаток = Остаток - 1;
   Если Остаток = 0 Тогда
        Прервать;
   КонецЕсли;
   КонецЦикла;
КонецЦикла;

// на выходе массив значений с рапределением
26 Aprobator
 
28.06.13
15:31
хотя 1 цикл лишний. Остаток не может быть больше количества ОбъектовРаспределения.
27 Lama12
 
28.06.13
15:37
(0)А фотки так и нет.
И задача решена.
Да и задача-от примитивная. :(
28 Aprobator
 
28.06.13
15:41
(27) запишем долг на счет ТС.
29 acsent
 
28.06.13
15:42
последний цикл можно так
Для ИндексМассива = 1 По остаток Цикл
30 elena_schleht
 
28.06.13
15:42
(28) за мной не заржавеет!
31 acsent
 
28.06.13
15:43
(28) через пару недель не поймешь что это такое
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.