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); }
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); }