POJ 1730 幂指数的最大值 + 精度 + C函数

来源:互联网 发布:淘宝号可以转让吗 编辑:程序博客网 时间:2024/04/30 12:14

这道题,唉,经验不足哇,之前想的若干方法,均超时了,从枚举因子 1 - > n^(1/2) 开始,TLE,再想了一个,分解成所有质因子,判断最小的质因子个数是否整除其它质因子个数,显然和前面一样,n 取很大的时候就不行了,也会TLE..于是就要想更好的方法,可能是我做题太少了,就去网上找了一下别人解法,一下子反应过来了,干脆直接开根号,判断得到的值是否是整数...就要用到    pow( n, 1.0 / i ) ; pow() 函数不仅可以求幂,也是可以开根号的...于是最后就是精度控制的问题了,这提示我第一次接触到精度控制的题目,没有经验,也不知道如何控制,又去查了一下,原来可以用几个 C 语言函数来实现的..

ceil ( ) 函数的用法,

        函数名: ceil

  用 法: int ceil(double x);
  功 能: 返回大于或者等于指定表达式的最小整数
  头文件:math.h

floor( )函数的用法

  函数名: floor

  功 能: 返回小于或者等于指定表达式的最大整数
  用 法: double floor(double x);
  头文件:math.h

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
const double eps=1e-12;  //// 精度控制

int main(){
    double n;
    while(scanf("%lf",&n),n){
        int flag=1;
        double ans;
        if(n>0){
            for(int i=31;i>=1;i--){
                double sum=pow(n,1.0/i);
                double up = ceil(sum), down = floor(sum) ;
                if(fabs(up-sum)<eps || fabs(down-sum)<eps){  ////  精度控制
                    cout<<i<<endl;
                    break;
                }
            }
        }
        else {
            n=-n;
            for(int i=31;i>0;i -= 2){
                double sum=pow(n,1.0/i);
                double up = ceil(sum), down = floor(sum) ;
                if(fabs(up-sum)<eps || fabs(down-sum)<eps){
                    cout<<i<<endl;
                    break;
                }
            }
        }
    }
}

原创粉丝点击