// Factor = (UnaryOp Factor) | (PowerBase ['^' Factor]) Rpn::CodeThread Parser::factor() { Rpn::CodeThread result; // UnaryOp Factor if (CheckLexeme::isUnaryOperation(m_lexer->lexeme())) { LexemeType lexemeType = m_lexer->lexeme().type; m_lexer->nextLexeme(); if (lexemeType == LexemeMinus) { result = m_codeGenerator->generateUnaryMinus(factor()); } else if (lexemeType == LexemePlus) { result = factor(); } else { THROW(EInternal()); } } // PowerBase ['^' Factor] else { result = powerBase(); // ['^' Factor] if (m_lexer->lexeme().type == LexemePower) { m_lexer->nextLexeme(); result = m_codeGenerator->generateBinaryOperation(BinaryOperationPower, result, factor()); } } return result; }
{ return base * base; } // 递归处理 if (exponent % 2 == 1) { return power(power(base, exponent >> 1), 2) * base; } else { return power(power(base, exponent >> 1), 2); } } double result = powerBase(base, exponent); if (isPositive) { return result; } return 1 / result; } /****************** 参考答案 ********/ bool g_InvalidInput = false; double power(double base, int exponent) { g_InvalidInput = false;