算法导论-实验二-幂运算精确值计算问题

幂运算精确值计算问题

Description
输入两个不超过10000的正整数a、n正整数n,输出a^n的精确结果。

Input
本问题有多组测试数据,对于每一组测试数据,只有一行,每行有用空格隔开的两个正整数。

Output
对于每一组测试数据,输出只有一行,即计算的结果。

Sample Input
2 3
91 37

Sample Output
8
3051627471597949451463369059654147285577479747909625754790616546501477931

//幂运算精确值计算问题
//输入两个不超过10000的正整数a、n正整数n,输出a^n的精确结果。
//最大值是 10000 的 10000 次方,也就是 10**(4*10000)=10 **(40000),所以最大是40001位

#include 
using namespace std;
#define MAX 40002 //由上面可得MAX的值,正好是40001位,因为下面j可能会比最大的实际情况40001多1位,尽管不会访问nBits[40001](从0开始,也就是第40002位),但设置为40002也是合理的
int nBits[MAX];//用数组来存储最后的结果值
int nBitsNum;//最后结果值的位数
void vInit();
void vPower(int nA,int nN);
void vOut(int nPos);

int main(){
    int nA,nN;
    while(cin>>nA>>nN){
        if (nA==1){// 1的任何次幂都是1,所以直接输出
            cout<<"1"<<endl;
        }else{ //其余的正常情况如下
            vInit();
            vPower(nA,nN);
            vOut(nBitsNum);
        }
    }
    return 0;
}

void vInit(){
    nBitsNum=1;//先初始化,结果至少有1位
}

void vPower(int nA,int nN){
    int nCarry,nTemp;
    int i,j;

    nBits[0]=1;//先将最低位赋为1,不然得不到第一次乘的值,第一步是要将nA与最低位相乘的
    for ( i = 1; i <= nN; i++) { //因为要乘nN次,这里从1开始
        nCarry=0;
        j=0;//j每次都从0开始,是因为做乘法每次从最低位开始的
        while (true){
            if (j<nBitsNum){//判断此时的j是否超过了nBitsNum,如果等于或者大于,则要去else里判断是否需要进位 ,为什么是j
                nTemp=nBits[j]*nA+nCarry;//正常的乘法与加上前一次的进位
                nBits[j]=nTemp%10;//每位只能是'0'-'9',所以要取余
                nCarry=nTemp/10;//记录下进位,在下次运算时加上
            }else{
                if (nCarry==0){//如果没有进位,正常结束本次的乘法
                    break;
                }
                nBits[j]=nCarry%10;//否则继续进位
                nCarry=nCarry/10;
            }
            j++;//处理完本位,继续往前加位数
        }
        nBitsNum=j;//每次乘法结束后更新nBitsNum的值,nBitsNum每次比实际上用到的j会大1,因为在break出来本次循环的上次循环中执行过 j++
    }
}

void vOut(int nPos){
    for (int i = nPos-1; i >= 0; i--) { //因为nPos==nBitsNum,而每次比实际上用到的j会大1,所以是nPos-1
        cout<<nBits[i];
    }
    cout<<endl;
}

你可能感兴趣的:(算法导论,算法,c++,数据结构)