Имя: Пароль:
IT
 
Формирование "красивой" цены
0 turbomilk8
 
02.07.14
07:31
Собственно есть диапазон чисел, например от 10864 до 11536, как (не перебором) получить число из этого диапазона с наибольшим количеством девяток, т.е. 10999?
1 Armando
 
02.07.14
07:37
Задача на собеседовании?
2 turbomilk8
 
02.07.14
07:38
(1) неа, просто одна из хотелок заказчика
3 DmitryTokmakov
 
02.07.14
07:50
меньшее число из диапазона округляешь в большую сторону, бОльшее - в меньшую. От бОльшего из получившихся отнимаешь 1. Вот только надо еще определить, до какого знака округлять.
4 MSII
 
02.07.14
07:51
Найти наибольшее кратное 10 и вычесть из него 1.
5 SeraFim
 
02.07.14
07:52
(4) 11529?
6 Armando
 
02.07.14
07:55
(0) >> не перебором
то есть за одну итерацию?
7 2S
 
02.07.14
07:57
"10"+999
8 patria0muerte
 
02.07.14
07:58
(0)Можно попробовать привести к строкам равной длины (меньшее добить нулями впереди), потом сравнить посимвольно, начиная с первого символа. Если различаются символы, то от большего числа отнимаем все что за этим символом + 1.

Вроде должно сработать.
9 MSII
 
02.07.14
07:58
(5) Неправильно сформулировал. Найти все кратные 10 в степени Х, где Х от 1 до СтрДлина(БольшееЧисло), входящие в диапазон, выбрать число с максимальным Х.
10 skunk
 
02.07.14
07:59
(9)это перебор
11 Cube
 
02.07.14
07:59
(0) Постановка задачи так себе...
Диапазон: 11536 - 11708. Какая цена "красивая"? 11599? 11699?
12 skunk
 
02.07.14
08:00
(8)без перебора
13 skunk
 
02.07.14
08:00
(11)с наибольшим количество девяток ... в данном случае 10999
14 skunk
 
02.07.14
08:01
брр ... понял
15 patria0muerte
 
02.07.14
08:01
(12) я полагаю, ТС имел ввиду без перебора чисел в целом...
16 SeraFim
 
02.07.14
08:03
Округлить верхнюю границу вниз до 10000, проверить входят ли в диапазон. Если нет, продолжаем:
Округлить верхнюю границу вниз до 1000, проверить входят ли в диапазон. Если нет, продолжаем:
Округлить верхнюю границу вниз до 100 вниз, проверить входят ли в диапазон. Если нет, продолжаем:
Округлить верхнюю границу вниз до 10 вниз, проверить входят ли в диапазон.
17 vde69
 
модератор
02.07.14
08:03
к1 - начало диапазона
к2 - конец диапазона

один из вариантов:
х=к1-(к2-к1)-1
18 patria0muerte
 
02.07.14
08:03
(0) Если цен с одинаковым наибольшим количеством девяток несколько, то полагаю что интересует наибольшее... так?
19 Starhan
 
02.07.14
08:03
(11)
11536 - 11708
ищем слева первую различающуюся цифру
115
117
смотри нет ли после 117 девяток
Если есть - это красивая цена
если нет
Вычитаем 1 из 117 и добавляем девятки


как то так.
20 skunk
 
02.07.14
08:05
(17)10864 - (11536 - 10864) - 1 = 10191
21 turbomilk8
 
02.07.14
08:09
(6) можно и не в одну, но без перебора
22 turbomilk8
 
02.07.14
08:10
(11) наибольшее, мы же продаем и хотим получить больше прибыли
23 vde69
 
модератор
02.07.14
08:12
к2-(к2-к1) + Число(Прав("99999999999999",СтрДлина(Формат(к2-(к2-к1),"ЧГ=0"))-1))
24 vde69
 
модератор
02.07.14
08:15
(23) все равно не правильно :)
25 skunk
 
02.07.14
08:21
(23)тут может быть три ситуации разница имеет на 1 разряд больше, нужное количество разрядов и имеет на 1 разряд меньше
26 JeHer
 
02.07.14
08:24
Надо справа начинать. Т.е. в цикле найти девятку справа, проверить на диапазон и  так далее.
27 dmpl
 
02.07.14
08:38
(0) Что значит "без перебора"? Как минимум, 1 "если" будет.
28 Cube
 
02.07.14
08:42
(22) Молоток.
То есть, в диапазоне 11001 - 11700 у нас красивая цена 11699,
а в диапазоне 10990 - 11700 у нас красивая цена 10999...
700 рублей туда-сюда - какие пустяки...
29 Armando
 
02.07.14
08:50
Разница = Верх - Низ;
    Если Разница = 0 Тогда
        Сообщить("!!!");
        Возврат;
    КонецЕсли;
    Если Верх%Pow(10, СтрДлина(Формат(Разница, "ЧГ=0"))) > Разница Тогда
        Сообщить(Верх - Верх%Pow(10, СтрДлина(Формат(Разница, "ЧГ=0"))-1) - 1);
    Иначе
        Сообщить(Верх - Верх%Pow(10, СтрДлина(Формат(Разница, "ЧГ=0"))) - 1);
    КонецЕсли;
30 dmpl
 
02.07.14
08:53
(28) Очевидно, если задан такой диапанон - то действительно пустяки. Если не пустяки - будет задан меньший диапазон. Ваш КЭП.
31 Armando
 
02.07.14
08:58
(29) только надо еще проверки навтыкать, чтоб низ был меньше верха, и чтоб в диапазоне 9 проскакивала
32 dmpl
 
02.07.14
09:00
(31) Там бага есть. Диапазон 10000-11000 дает 9999. А чтобы от этого избавиться - придется цикл организовывать ;)
33 dmpl
 
02.07.14
09:13
+(32) И если цена с копейками - глючит (например, 10864,05 - 11536,76 дает -1) или неверный результат (например, при 10864,45 - 11536,95 дает 9999).
34 Armando
 
02.07.14
09:15
(32) если так заемнить Верх%Pow(10, СтрДлина(Формат(Разница, "ЧГ=0"))) >= Разница
35 Armando
 
02.07.14
09:15
(33) ну с копейками да. представим что их нет)
36 Бешеная Нога
 
02.07.14
09:30
сделай обычным перебором, будь мужиком, блеать! и не выноси мозг честным людям
37 samozvanec
 
02.07.14
09:34
а чем (3) не устроило?
38 samozvanec
 
02.07.14
09:41
или берешь верхнюю границу, первую цифру слева - отнять один, остальные девятки. и предусмотреть, что если первая цифра единица, то просто остальные девятки берешь без нее.
39 samozvanec
 
02.07.14
09:43
+(38) пардон, не так хотел сказать. по разрядам поделить и первый разряд уменьшать на 1, дополнить девятками.
40 Крошка Ру
 
02.07.14
09:54
(36) Перебором - это для тех у кого есть яйца. Остальные ищут обходные пути.
41 Крошка Ру
 
02.07.14
09:55
+(40) Вот ещё способ: делаешь массив от нижнего до верхнего предела. Сначала удаляешь из него цены без девяток, потом - цены с одной девяткой, потом - с двумя и т.д.
В живых должна остаться только одна цена!
42 turbomilk8
 
02.07.14
09:58
(28) именно так, но больших перепадов не будет, т.к. диапазон
это +-3% к какой-то входящей цене. В моем примере это 11200, поэтому диапазон от 10864 до 11536.
43 turbomilk8
 
02.07.14
09:59
(40) класс!!!
44 turbomilk8
 
02.07.14
10:01
(37) как узнать до какого знака округлять?
45 dmpl
 
02.07.14
10:04
(41) Делаешь регистр сведений КрасивыеЦены (где все красивые цены лежат), потом из него выбираешь запросом :)
46 turbomilk8
 
02.07.14
10:09
(45) и пусть заказчик его сам вручную заполняет, так и ко мне вопросов не будет, и сам в следующий раз не будет выдумывать фигню всякую :-)
47 Крошка Ру
 
02.07.14
10:12
(46) Не-не-не... Цены - красивые, поэтому заполнять регистр должен специально нанятый дизайнер!
48 Крошка Ру
 
02.07.14
10:15
(45) А идея хорошая! Есть в ней что-то такое, одинэсное... Один раз заполнил регистр, а потом - запросы к нему с любыми отборами, какие левая пятка пожелает.
49 acsent
 
02.07.14
10:19
не перебором но спуском вниз.
ш.1 Округляем до 10 вниз
Если в диапазоне то ш2
ш2. Огругляем до 100 вниз
итд
50 Бешеная Нога
 
02.07.14
10:19
+1 к регистру с с записями от 1 до 100000 с ресурсом - количество девяток.
потом запрос к регистру по диапазону и получение максимального.

имхо быстрее всего + можно использовать в запросе
51 SeraFim
 
02.07.14
10:21
(50) а мы тут яхтами торгуем(
52 Бешеная Нога
 
02.07.14
10:22
(51) без шуток) механизм реально оптимальнее всего
53 samozvanec
 
02.07.14
10:23
(44) по количеству циферок. собственно, в (38) тоже самое, только велосипед локального производства
54 Крошка Ру
 
02.07.14
10:29
+(50) И заносить туда цены без девяток, тогда количество записей на порядок сократится.
55 Крошка Ру
 
02.07.14
10:33
*не заносить
56 Armando
 
02.07.14
10:35
(0) Автор, (29) и (34) не работает чтоле?
57 turbomilk8
 
02.07.14
11:50
(56) Проверяю. Большое спасибо за помощь
58 PR
 
02.07.14
12:30
(0) Цикл от 5 до 1, где 5 — длина числа.
5 девяток меньше числа? Если да, то это и есть максимальное число. Нет, тогда идем дальше по циклу.
4 девятки меньше числа? Если да, то это и есть максимальное число. Нет, тогда идем дальше по циклу.
...
Прошли цикл и ничего не нашли? Значит число меньше 9.
59 PR
 
02.07.14
12:31
(58) А, пардон, речь же не про максимальное число, а про число с максимальным количеством девяток.
60 turbomilk8
 
02.07.14
12:53
Да, именно так. Но число это должно быть в диапазоне: исходная цена +-3%
61 PR
 
02.07.14
12:55
(60) Мне кажется, проще всего сделать перебором от минимума до максимума.
62 Djoko
 
02.07.14
13:06
Попробуй брать по 1 символу с лева, до первого различающегося, в начальном и конечном диапазоне.
Начальные символы + (отличный символ из большего числа-1)+девятки. Только если диапазоны разной длинны, нужно в начале нули подставить.
63 wel_ko
 
02.07.14
14:02
Попробуй так. Вроде работает.
    
Если СтрДлина(Цел(Число2))=2 Тогда
        Делитель2 = 10;
    ИначеЕсли СтрДлина(Цел(Число2))=3 Тогда
        Делитель2 = 100;
    Иначе              
        Делитель2 = 1000;
    КонецЕсли;  
            
    Число1Дел = Цел(Число1/Делитель2);
    Число2Дел = Цел(Число2/Делитель2);
    Если (Число2Дел-Число1Дел)<1 Тогда
        НовыйДелитель2 = Делитель2/10;
         Cообщить((Цел(Число2/НовыйДелитель2)*НовыйДелитель2)-1);
    Иначе
        Сообщить((Число2Дел*(Делитель2))-1);
    КонецЕсли;
64 turbomilk8
 
03.07.14
08:03
Остановился на таком варианте:

        Верх = Окр(1.03 * ИсходнаяЦена);
    Низ = Окр(0.97 * ИсходнаяЦена);
    
    Итератор = 1;
    КрасиваяЦена = ИсходнаяЦена;
    Пока Истина Цикл
        
        НоваяЦена = Окр(ИсходнаяЦена, -Итератор) - 1;
        Если НоваяЦена < Низ ИЛИ НоваяЦена > Верх Тогда
            Прервать;
        Иначе
            КрасиваяЦена = НоваяЦена;
        КонецЕсли;
        
        Итератор = Итератор + 1;
        
    КонецЦикла;
65 SeraFim
 
03.07.14
08:16
(64) не выполняется условие максимальности)
По правилам округления, округлит вниз. Но вполне возможно, что и при округлении вверх число тоже было бы в пределах даипазона
66 turbomilk8
 
03.07.14
08:23
(65) Это даже хорошо, а то он из 555 делал 569, а сейчас 559
67 Starhan
 
03.07.14
08:34
Может проще пройтись по всем разрядам округляя числа до этого рарзяда (в меньшую сторону) и вычитая большее из меньшего. Так найдешь отличающийся разряд.

Потом из этого числа вычесть 1.

И учесть еще нет ли у большей цены сразу красивой цены
68 Эмбеддер
 
03.07.14
08:37
(0) пусть заказчик просто составит список чисел, которые он считает красивыми
69 Эмбеддер
 
03.07.14
08:38
и 10999 как-то не похоже на красивое число
даже 11011 более красиво
70 Asmody
 
03.07.14
08:41
Вроде в какой-то типовой был эльдорадоризатор цен
71 Starhan
 
03.07.14
08:51
Кстати 10999 это не красивая цена - а психологическая уловка
воспринмая как 10 тысяч плюс хвостик, а не 11 000 :)
72 SeraFim
 
03.07.14
08:59
(71) О, Капитан, мой Капитан!
73 Эмбеддер
 
03.07.14
09:00
(70) в УТ 11 точно есть, называется "психологическое округление"
74 Эмбеддер
 
03.07.14
09:01
(71) еще удобно, что не надо у клиента мелочь просить, сдача всегда будет в кассе рублей 10)))