高效率的取幂运算(递归解法跟非递归解法)

1. 递归解法

时间复杂度为 O(logN)

long int
Pow( long int x, unsigned int n ) { // 求幂运算
    if( n == 0 )
        return 1;
    if( n == 1 )
        return x;
    if( n % 2 == 0 )
        return Pow( x * x, n / 2 );
    else
        return Pow( x, n - 1 ) * x;         // 可以用下列的注释行替换
        //return Pow( x * x, n / 2 ) * x;
}

2. 非递归解法

两种非递归的解法来进行快速的取幂运算

(1) 第一种解法:

long int
Pow( long int x, unsigned int n ) {    // 求幂运算
    int y, mul, temp;

    if( n == 0 )
        return 1;
    if( n == 1 )
        return x;

    y = x, mul = 1;
    while( n > 1 ) {
        if( n % 2 == 0 ) {
            temp = y * y;
            y = temp;
            n = n / 2;
        }
        else {
            mul *= y;
            n = n - 1;
        }
    }
    y = mul * y;

    return y;
}

(2) 第二种解法:

long int
Pow( long int x, unsigned int n ) {    // 求幂运算
    int y, mul, temp;

    if( n == 0 )
        return 1;
    if( n == 1 )
        return x;

    y = x, mul = 1;
    while( n > 1 ) {
        if( n % 2 == 0 ) {
            temp = y * y;
            y = temp;
            n = n / 2;
        }
        else {
            mul = mul * y;
            temp = y * y;
            y = temp;
            n = n / 2;
        }
    }
    y = mul * y;

    return y;
}
posted @ 2016-10-30 08:53  夏夜星空晚风  阅读(862)  评论(0编辑  收藏  举报