poj1730

/*

以前做的一道水题,再做精度控制又出了错///。。。

*/

题目大意:

求最大完全平方数,一个数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;
                }
            }
        }
    }
}
View Code

ps:这题的n我不能设成long long ,具体原因暂时还不知道,日后更新。

原文地址:https://www.cnblogs.com/SunQi-lvbu/p/6815813.html