POJ 1001Exponentiation解题报告——求高精度幂——【PKU ACM】

这道题目的整体思想,就是将float型数据,转化成整数,将计算float型幂次方,转变成求整数的幂次方。
然后利用数组来存储乘积的每一位。
核心代码就是那一段高精度求幂的代码,希望大家能够自己仔细研究。
#include<iostream> #include<string> #include<vector> using namespace std; int main(){ string r; //输入的底数 int n; //输入指数值 //实现多次计算 while(cin>>r>>n){ /* //这一段是用来处理输入数据,将输入的浮点数,转化为末尾没有0的整数。 */ int num(0); //输入的浮点数整数化 int count(0); //输入浮点数的小数点位数 vector<int> result; //最后的计算结果存储 //剔除小数点后,数据末尾的0 for(int i=r.length()-1;i>=0;--i){ if(r.at(i)=='0') r.erase(i); else break; } //计算出小数点的位数 for(int i=r.length()-1;i>=0;--i){ if(r.at(i)=='.'){ count=r.length()-1-i; break; } } //将string类型转化成int for(int i=0;i<r.length();++i){ if(r.at(i)=='.') continue; num=num*10+(r.at(i)-'0'); } /* //整数高精度乘法 */ result.push_back(1); for(int i=0,temp=0,sum=0;i<n;++i){ //用模拟幂次方 for(int j=0;j<result.size();++j){ sum=result[j]*num+temp; //记录每一次乘积 if(sum>9){ //如果乘积大于9 result[j]=sum%10; //保留小于9,也就是低位数 temp=sum/10; //计算出进位数据 if(j==result.size()-1) //看是否超过目前最高位了。 result.push_back(0); } else{ temp=0; //若小于9,则表示没有进位,temp=0 result[j]=sum; } } } /* //输出控制流程 */ int length=result.size(); //求取整个大整数的长度 int difference=length-n*count; //这是实际整数部分的长度 if(difference>0){ //如果存在整数部分 for(int i=result.size()-1;i>=0;--i){ if(i==result.size()-difference-1) cout<<'.'; cout<<result[i]; } } else if(difference==0){ //如果只有小数部分 cout<<'.'; for(int i=result.size()-1;i>=0;--i) cout<<result[i]; } else{ //小数部分不足,要用0补齐 cout<<'.'; for(int i=0;i<-difference;++i) cout<<0; for(int i=result.size()-1;i>=0;--i) cout<<result[i]; } cout<<endl; } return 0; } POJ 1001Exponentiation解题报告——求高精度幂——【PKU ACM】_第1张图片

你可能感兴趣的:(POJ 1001Exponentiation解题报告——求高精度幂——【PKU ACM】)