Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Разложить число. (http://www.flasher.ru/forum/showthread.php?t=195046)

GBee 28.02.2013 02:20

Цитата:

Единственный найденное пока ограничение - номиналы должны быть в порядке возрастания
Что же делать? :о)

KumoKairo 28.02.2013 02:44

А нет, там с перезаписью массива проблемы, блин)
Ладно, потом поправлю, тут уже два способа и так предложили)

alatar 28.02.2013 03:36

Проверь на варианте -De-

Nooob 28.02.2013 03:49

Цитата:

Сообщение от KumoKairo (Сообщение 1122818)
А я таки тоже сделал своим алгоритмом

выдаёт такие значения при перезапуске:
1,1,0.5,0.01,0.01,0.01,1 (3.5299999999999994)
1,1,0.5,0.01,0.01,0.01,0.01 (2.539999999999999)
1,1,0.5,0.01,0.01,0.01,0.5 (3.0299999999999994)

нестабильно както, я думаю всё дело в рандоме

KumoKairo 28.02.2013 08:20

Не не, вы видимо не скопировали ту функцию toFixed
Дело в том, что в AS3 пониженная точность у double floating point значений, и часто при вычитании таких чисел, например
Код AS3:

trace(2.53 - 1);
trace(4.14 - 2);

результатом выдает 1.5299999993 и 4.13999995 соответственно. Эти проблемы точности простых вычислений много обсуждаются на stackOverflow, и там приняли использовать ту функцию округления.

Рандом там просто находит индекс перераскладываемого числа)

alatar 28.02.2013 13:21

KumoKairo, работает медленнее перебора. Выдает неверный результат при входных данных [10, 11], 110, 11. Уходит в вечный цикл при входных данных [11, 10], 110, 11.

KumoKairo 28.02.2013 14:14

Да, я же написал что там косяки
Получилось совсем не так, как планировалось
Грубо говоря обычный жадный алгоритм с дополнением, которое неправильно работает

Wolsh 28.02.2013 15:03

Весело у вас тут))
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author wolsh
        */

        public class Main extends Sprite
        {
                private var _coinsCount:uint = 7;
                private var _nominals:Array = [0.01, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 50, 100, 500, 1000];
                private var _summ:Number = 125.15;
                private var _result:Array;
 
                public function Main():void
                {
                        _nominals = _nominals.sort(16);
                        while (_nominals[_nominals.length - 1] > _summ) _nominals.pop();
 
                        _result = new Array(_coinsCount);
                        for (var i:uint = 0; i < _coinsCount; i++)
                        {
                                _result[i] = _nominals[0];
                        }
 
                        count:for (var n:uint = 0; n < _coinsCount; n++)
                        {
                                nominal:for (var c:uint = 1; c < _nominals.length; c++)
                                {
                                        _result[n] = _nominals[c];
                                        if (summ(_result) < _summ)
                                        {
                                                continue nominal;
                                        }
                                        if (summ(_result) > _summ)
                                        {
                                                _result[n] = _nominals[c - 1];
                                                continue count;
                                        }
                                        if (summ(_result) == _summ)
                                        {
                                                break count;
                                        }
                                }
                        }
                        if(summ(_result) == _summ) trace("Получилось!", _result, "(", summ(_result), ")");
                        else trace("Близкий результат:", _result, "(", summ(_result), ")");
                }
 
                private function summ(array:Array):Number
                {
                        var result:Number = 0;
                        for (var i:uint = 0; i < array.length; i++)
                        {
                                result += array[i];
                        }
                        return Math.round(result * 100) / 100;
                }
        }
}


iflamberg 28.02.2013 15:16

Я нуб. Я не знал, что можно вот так nominal:for.

wvxvw 01.03.2013 01:15

Та это ж классика... из SICP, упражнение 2.19 :) Вы чего?

Вот, собсно, с объяснениями и кодом. Если что не понятно, я перепишу на AS.
http://wiki.drewhess.com/wiki/SICP_exercise_2.19


Часовой пояс GMT +4, время: 02:35.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.