您的位置:首页 > Web前端

poj 1730 Perfect Pth Powers

2013-07-14 19:47 309 查看
这个有2种方法。

一种是通过枚举p的值(p的范围是从1-32),这样不会超时,再就是注意下精度用1e-8就可以了,还有要注意负数的处理……

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<string>
using namespace std;
int fun(double n)
{
int p=32,f=1;
if(n<0)
{
p=31;
f=2;
n=-n;
}
for(;p>=1;p-=f)
{
double a=pow(n,1.0/p);
long t1=a;
long t2=a+1;
if(a-t1<=1e-12||t2-a<=1e-12)
break;
}
return p;
}
int main()
{
int x,p;
while(cin>>x&&x)
{
p=fun(x);
cout<<p<<endl;
}
return 0;
}


第二种方法就是分解素数因子,求出因子的指数的最大公约数就是答案了,但是我这测试没错,提交超时……

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<cmath>
#include<iomanip>
#include<string>
using namespace std;
int prime[100001],a[100001];
void init()
{
int i,j,k=0;
for(i=2;i<=100000;i++)
{
if(!a[i])
{
prime[k++]=i;
for(j=i+i;j<=100000;j+=i)
a[j]=1;
}
}
}
int gcd(int a,int b)
{
int c;
if(a<b) swap(a,b);
while(b)
{
c=a;
a=b;
b=c%b;
}
return a;
}
int main()
{
int n,i,j;
bool flag;
init();
while(scanf("%d",&n),n)
{
flag=0;
if(n<0)
{
flag=1;
n=-n;
}
vector<int> key;
for(i=0;prime[i]*prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
int c=0;
for(;n%prime[i]==0;n/=prime[i],c++);
key.push_back(c);
}
}
if(n>1) key.push_back(1);
int sum=key[0];
for(i=1;i<key.size();i++)
sum=gcd(sum,key[i]);
if(flag)
{
while(sum%2==0)
sum/=2;
}
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: