예제 #1
0
파일: parser.cpp 프로젝트: ming13/aequatio
// 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;
}
예제 #2
0
        {
            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;