private bool NextNumeralIsTenTimesGreater(NumeralNode numeralNode) { var currentDecimal = _numeralRepository.GetDecimalFor(numeralNode.Numeral); var nextDecimal = _numeralRepository.GetDecimalFor(numeralNode.Next.Numeral); if (nextDecimal > currentDecimal*10) throw new InvalidRomanNumeralException(String.Format("Error: Invalid Roman Numeral Format, '{0}' can not be subtracted from numeral that is 10 times greater.({1})", numeralNode.Numeral, numeralNode.Next.Numeral)); return false; }
public bool PowerOfTen(NumeralNode numeralNode) { // algorithm from: www.exploringbinary.com/ten-ways-tocheck-if-an-integer-is-a-power-of-two-in-c var value = _numeralRepository.GetDecimalFor(numeralNode.Numeral); while (((value % 10) == 0) && value > 1) { value /= 10; } return (value == 1); }
private int CalculateDecimal(NumeralNode numeralNode) { if (numeralNode.Next == null) { return _numeralRepository.GetDecimalFor(numeralNode.Numeral); } if (PowerOfTen(numeralNode) && NextNumeralIsGreater(numeralNode) && !NextNumeralIsTenTimesGreater(numeralNode)) { return CalculateDecimal(numeralNode.Next) - _numeralRepository.GetDecimalFor(numeralNode.Numeral); } return _numeralRepository.GetDecimalFor(numeralNode.Numeral) + CalculateDecimal(numeralNode.Next); }
private bool NextNumeralIsGreater(NumeralNode numeralNode) { return _numeralRepository.GetDecimalFor(numeralNode.Next.Numeral) > _numeralRepository.GetDecimalFor(numeralNode.Numeral); }