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;
}
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;
}
相关文章推荐
- Linux下网络配置
- 远程教育应用爆发促进视频会议发展
- linux 批量文件重命名
- 文章标题
- 公众号第三方平台开发 教程六 代公众号使用JS SDK说明
- <java> 昨天今天明天
- 周鸿祎产品思想汇总
- CocoaPods的安装和使用
- fdxxcz
- codeforces578C. Weakness and Poorness
- 交互设计基本功!5个值得学习的APP交互方式
- IOS第一天-新浪微博 - 框架的搭建
- 四大湖排名
- 【转】PhpStorm 提交代码到远程GitHub仓库
- Unity3D研究院之Android使用ANT自动打包(七十九)
- PathAppend几个注意点
- 学习H5写的第一个登录页面
- 字符编码笔记:ASCII,Unicode和UTF-8
- JavaCV 图像修复-小学cvInpaint 算法
- Android发送短信并监测发送状态