/*
以前做的一道水题,再做精度控制又出了错///。。。
*/
题目大意:
求最大完全平方数,一个数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>)
{
for (int i=; i>=; 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=;i>=;i-=)
{
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 ,具体原因暂时还不知道,日后更新。