hdu 1063 Exponentiation

来源:互联网 发布:app软件官方下载 编辑:程序博客网 时间:2024/04/29 07:51

本以为1753很坑了,没想到1063更坑,其实思路很简单,就是去掉小数点,进行高精度乘法,再加上小数点

以下为ac代码,要注意的地方都在注释里

#include<iostream>using namespace std;const int L=2101;string mul(string a,string b)//高精度乘法a,b,均为非负整数{    string s;    int na[L],nb[L],nc[L],La=a.size(),Lb=b.size();//na存储被乘数,nb存储乘数,nc存储积    fill(na,na+L,0);fill(nb,nb+L,0);fill(nc,nc+L,0);//将na,nb,nc都置为0    for(int i=La-1;i>=0;i--) na[La-i]=a[i]-'0';//将字符串表示的大整形数转成i整形数组表示的大整形数    for(int i=Lb-1;i>=0;i--) nb[Lb-i]=b[i]-'0';    for(int i=1;i<=La;i++)        for(int j=1;j<=Lb;j++)        nc[i+j-1]+=na[i]*nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(先不考虑进位)    for(int i=1;i<=La+Lb;i++)        nc[i+1]+=nc[i]/10,nc[i]%=10;//统一处理进位    if(nc[La+Lb]) s+=nc[La+Lb]+'0';//判断第i+j位上的数字是不是0    for(int i=La+Lb-1;i>=1;i--)        s+=nc[i]+'0';//将整形数组转成字符串    return s;}string fie(string a){int flag=0;int i;    for(i=0;i<a.size();i++)    {    if(a[i]=='.'){flag=1;break;}    }    if(flag)    {    while(a[a.size()-1]=='0')    {    a.erase(a.size()-1,1); //处理掉数据的前导0和末尾0;一定要先判断是否为浮点数, (1000与1.000000)     }    for(i=0;a[i]!='.';){if(a[i]=='0') a.erase(i,1);              else break;  }      }    else    {    for(i=0;a[i]=='0';)    {    a.erase(i,1);     }    }    return a;}int poi(string a){int i;for(i=0;i<a.size();i++){if(a[i]=='.') return i;   //检测是否为小数,若是,则输出小数点的位置,否则输出-1; }return -1;}string dpow(string x,int n){int i;string ans="1";for(i=0;i<n;i++){ans=mul(ans,x);      //高精度幂 }return ans;}int test(string a){int i,t=0;for(i=0;i<a.size();i++){if(a[i]!='0'&&a[i]!='.') t++;     //检测看是否为0,   (00.00000) }if(t) return 0;else return 1;}string ddpow(string a,int b)//高精度浮点数阶乘 {string ans;int i;if(test(a)){return "0";}//若a为0,直接输出 a=fie(a);//对a预处理 if(a[a.size()-1]=='.'){a.erase(a.size()-1,1); }//像2.这样的数据直接去掉小数点; if(poi(a)==-1) {return dpow(a,b);}//如果a为整数,直接计算, else{int sum=(a.size()-poi(a)-1)*b;//计算结果小数点的位数, //cout<<sum<<endl;a.erase(poi(a),1);//去掉小数点 while(a[0]=='0')//像.00000234这样的数据去掉小数点后还要去掉前导0; {a.erase(0,1); }a=dpow(a,b);//计算高精度幂 if(a.size()<sum)//0.0000000000008762             {            ans+='.';                               for(i=0;i<sum-a.size();i++) ans+='0';                ans+=a;            }            else if(a.size()>sum)//123.432423             {                ans+=a.substr(0,a.size()-sum)+'.'+a.substr(a.size()-sum,sum);              }else if(sum==a.size()){ans+='.'+a;}return ans;   }} int main(){string a;int b;while(cin>>a>>b){cout<<ddpow(a,b)<<endl;}return 0;} 


 


 

0 0