poj1730 - Perfect Pth Powers(完全平方数)(水题)
/*
以前做的一道水题,再做精度控制又出了错///。。。
*/
题目大意:
求最大完全平方数,一个数b(不超过int范围),n=b^p,使得给定n,p最大;
题目给你一个数n,求p ;
解题思路:
不需要遍历b,只需要从31开始遍历p就好了。这个方法涉及到我以前过分逃避的精度控制问题:本题会使用函数pow
而pow的返回值是double转化成int 会有损失,比如4的double表示可以使4.00000000或者3.99999999999;而我们使用
强制类型转换会截取整数部分结果就可能是3,因此只需要对强制转换的数据进行+0.1操作,可以解决这问题。
具体做法见代码。
代码:
#include<iostream> #include <vector> #include <algorithm> #include <queue> #include<set> #include <cstdio> #include<iterator> #include <cmath> using namespace std; int main() { int a; while (cin>>a&&a) { if(a>0) { for (int i=31; i>=1; i--) { int x=(int )(pow(a*1.0,1.0/i)+0.1); int y=(int )(pow(x*1.0,1.0*i)+0.1); if (y==a) { cout<<i<<endl; break; } } } else { a=-a; for (int i=31;i>=1;i-=2) { int x=(int )(pow(a*1.0,1.0/i)+0.1); int y=(int )(pow(x*1.0,i*1.0)+0.1); if (y==a) { cout<<i<<endl; break; } } } } }
ps:这题的n我不能设成long long ,具体原因暂时还不知道,日后更新。