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
- Exponentiation hdu 1063 java
- HDU 1063 Exponentiation
- hdu 1063 Exponentiation(大数)
- HDU 1063 - Exponentiation
- HDU 1063 Exponentiation
- HDU 1063 Exponentiation
- hdu 1063 Exponentiation
- hdu 1063 Exponentiation
- hdu 1063 Exponentiation
- HDU 1063 Exponentiation
- hdu 1063 Exponentiation
- hdu 1063 Exponentiation 大数
- HDU 1063 Exponentiation
- hdu 1063 Exponentiation
- HDU 1063 Exponentiation
- HDU-1063 Exponentiation
- HDU 1063Exponentiation
- hdu 1063 Exponentiation
- 浅谈Java泛型编程
- 编译原理之DFA的实现,使用双重switch
- STL算法:prev_permutation和next_permutation的使用
- MongoDB 文档的嵌入和引用
- 网络安全热门资料 精品工具——下载目录
- hdu 1063 Exponentiation
- oc编程中一种错误
- d3的一些东西
- 2012 PHP热门资料64个+经典源码50个——下载目录 :
- 最短路径A*算法原理及java代码实现(看不懂是我的失败)
- 主席树学习记录
- Linux的运行级别和chkconfig用法
- SQL Server将一列的多行内容拼接成一行或一个字符串的问题
- NYOJ 710