一种改进的求整数x的y次幂

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
/*
This is a free Program, You can modify or redistribute it under the terms of GNU
*Description:一种改进的求整数x的y次幂
*Language: C++
*Development Environment: VC6.0
*Author: Wangzhicheng
*E-mail: 2363702560@qq.com
*Date: 2012/10/14
*/
 
/*
核心方法是利用乘方的性质
当x求出,x^2=x*x,当x^2求出,x^4=(x^2)*(x^2) ,依次类推
*/
 
const int max=100000000;  //底数最大的数
 
class Power {
private:
    int base;       //底数
    int exponent;    //指数
    long result;    //存放结果
public:
    Power(int b,int e) {
        if(b<0 || b>=max) {
            cerr<<"底数应该大于等于0且小于"<<max<<endl;
            exit(1);
        }
        if(e<0 || e>max/10000) {
            cerr<<"指数应该大于等于0且小于"<<(max/10000)<<endl;
            exit(1);
        }
        base=b;
        exponent=e;
    }
    void power() {
        int result=1;
        power(exponent,result);
        setResult(result);
        show();
    }
    void power_common() {
        int i;
        int result=1;
        for(i=0;i<exponent;i++) {
            result=result*base;
        }
        setResult(result);
        show();
    }
    void show() {
        if(result<0) {
            cerr<<"结果溢出!"<<endl;
            result=0;
            return;
        }
        cout<<"power("<<base<<","<<exponent<<")="<<result<<endl;
    }
private:
    void setResult(int r) {
        result=r;
    }
    void power(int exponent,int &result) {
        int pre=1;     //前面值
        int temp=base;    //每一位对应的权值
        while(exponent) {
            if(exponent%2) {
                result=pre*temp;
                pre=result;
            }
            temp=temp*temp;
            exponent/=2;
        }
    }
};
 
void main() {
    srand(unsigned(time(0)));
    int i;
    int x,y;
    const int N=10;
    for(i=0;i<N;i++) {
        x=rand()%(N*N);
        y=rand()%N;
        Power power(x,y);
        power.power();
        power.power_common();
    }
}