private NailNumber CheckSplit(ref bool split) { if (IsNumber) { if (_value > 9) { var node = new NailNumber(new NailNumber(_value / 2), new NailNumber((_value + 1) / 2)); node._left.SetPrevious(_previous); _previous?.SetNext(node._left); node._right.SetNext(_next); _next?.SetPrevious(node._right); split = true; return(node); } } else { _left = _left.CheckSplit(ref split); if (split) { return(this); } _right = _right.CheckSplit(ref split); } 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); }