南邮 OJ 1016 求幂
2015-08-03 10:17
218 查看
求幂
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 603 测试通过 : 146
比赛描述
求R的n次幂(0.0<r<99.999,0<n<=25)
输入
每行输入两个数R和n
R值占1-6列,n占8-9列
输出
对应于每一行输入,输出R的n次幂
前导的0不要输出
无意义的0不要输出
如果结果是一个整数,不要输出小数点
最后一行是空行
样例输入
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
样例输出
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
题目来源
POJ
#include<iostream> using namespace std; #define LEN 130 //LEN:最终结果有LEN位 #define len1 6 //存放浮点数的数组有len1位 #include<string> int main() { string str; //str:接收到的数字,按照字符串存储 int n; //n:幂 while(cin>>str>>n) { int i,j,k,L; int a[len1],r[LEN]; //a[]接收到的数据,r[]将要输出的数据 for(i=0;i<len1;i++) //两个数组清零 a[i]=0; for(i=0;i<LEN;i++) r[i]=0; j=0; for(i=str.size()-1;i>=0;i--) //这里讲字符串倒顺序、转化为数字,即a[]、r[]高表表存放的数字的高位 { if(str[i]=='.'){k=i;continue;} //k:小数点的下标 else { a[j]=(int)(str[i]-'0'); //去除小数点之后的数字,相当于扩大了10^(str.size()-(k+1))倍 r[j]=(int)(str[i]-'0'); j++; } } L=n*(str.size()-(k+1)); //L:最终结果扩大了10^L倍 for(i=1;i<n;i++) //执行了n-1次 { int c[LEN*2]; //暂时存放每次相乘一次的结果,防止精度丢失,用了双倍长度的数组 for(j=0;j<LEN*2;j++) c[j]=0; for(k=0;k<len1;k++) //每一位单独相乘 { for(j=0;j<LEN;j++) c[k+j]+=r[j]*a[k]; //这里a[]是去掉小数点之后的数字 } for(k=0;k<LEN*2;k++) //将进为放在更高位,余数方位本位 { if(c[k]>=10) { c[k+1]+=c[k]/10; c[k]%=10; } } for(k=0;k<LEN;k++) //将每次相乘的结果放回r[] r[k]=c[k]; } for(i=LEN-1;i>=L;i--) //最高位的零不输出 { if(r[i]!=0) break; } for(j=i;j>=L;j--) //输出正数部分 cout<<r[j]; for(i=0;i<L;i++) //小数点右边无意义的0不输出 { if(r[i]!=0)break; } if(i<L) //如果有消暑部分的话输出小数点 cout<<'.'; for(i=0;i<L;i++) //输出小树部分 { if(r[i]!=0)break; } for(j=L-1;j>=i;j--) cout<<r[j]; cout<<endl; } return 0; }