您的位置:首页 > 其它

POJ1001 Exponentiation【高精度】

2015-09-17 11:40 337 查看
题目链接:

http://poj.org/problem?id=1001

题目大意:

给你一个浮点数 s 和整数 N,求 s 的 N 次方。其中(0 < N <= 5),而浮点数 s 算上小

数点共占 6 位。

解题思路:

考虑到浮点数 s 最多只有 6 位,且 N 最多为25,那么通过 s 的小数点位置计算出小数

点在 s 的
N 次方的结果中的位置。然后将 s 变为不含小数点的整数 num,通过高精度

乘以单精度的模板求出 num 的 N 次方。然后根据题目要求输出结果。

注意:不仅要清除整数部分的前导 0,还要清除小数部分后边的 0。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int MAXN = 130;

int na[MAXN];

string Mul(string a,int b)
{
string ans;
int La = a.size();
fill(na,na+MAXN,0);
for(int i = La-1; i >= 0; --i)
na[La-i-1] = a[i] - '0';
int w = 0;
for(int i = 0; i < La; ++i)
{
na[i] = na[i]*b + w;
w = na[i] / 10;
na[i] = na[i] % 10;
}
while(w)
{
na[La++] = w % 10;
w /= 10;
}
La--;
while(La >= 0) //清除前导 0
ans += na[La--] + '0';
return ans;
}

char s[7];

int main()
{
int N;
while(~scanf("%s %d",s, &N))
{
int pos = 0,num = 0;
for(int i = 0; i < strlen(s); ++i)
{
if(s[i] == '.')
{
pos = (strlen(s)-i-1)*N; //计算浮点数s^N小数点后的位数
}
else
{
num = num*10 + s[i] - '0'; //将浮点数s转变为整数
}
}
string a;
a += '1';
for(int i = 0; i < N; ++i) //计算 num^N
a = Mul(a,num);

int len = a.size();
if(len <= pos) //结果小于 0
{
printf(".");
for(int i = 0; i < pos-len; ++i)
printf("0");
cout << a << endl;
}
else //结果大于 0
{
int j = len-1;
while(a[j]=='0' && j > len-pos-1) //清除小数部分后边的0
j--;
for(int i = 0; i <= j; ++i)
{
if(i == len-pos)
printf(".");
printf("%c",a[i]);
}
printf("\n");
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: