예제 #1
0
            private NailNumber CheckExplode(ref bool explode, int depth = 0)
            {
                if (IsNumber)
                {
                    return(this);
                }

                if (depth == 4)
                {
                    // too deep
                    explode = true;
                    var node = new NailNumber(0);
                    if (_left._previous != null)
                    {
                        _left._previous._value += _left._value;
                        node.SetPrevious(_left._previous);
                        _left._previous.SetNext(node);
                    }

                    if (_right._next == null)
                    {
                        return(node);
                    }
                    _right._next._value += _right._value;
                    node.SetNext(_right._next);
                    _right._next.SetPrevious(node);
                    return(node);
                }

                _left  = _left.CheckExplode(ref explode, depth + 1);
                _right = _right.CheckExplode(ref explode, depth + 1);
                return(this);
            }
예제 #2
0
            public NailNumber Add(NailNumber a)
            {
                var  result = new NailNumber(new NailNumber(this), new NailNumber(a));
                bool redo;

                do
                {
                    redo = false;
                    result.CheckExplode(ref redo);
                    if (!redo)
                    {
                        result.CheckSplit(ref redo);
                    }
                } while (redo);

                return(result);
            }