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