poj1730 素数 Perfect Pth Powers
2016-10-02 15:12
411 查看
Description
We say that x is a perfect square if, for some integer b, x = b 2. Similarly, x is a perfect cube if, for some integer b, x = b 3. More generally, x is a perfect pth power if, for some integer b, x = b p. Given an integer x you are to determine the largest p such that x is a perfect p th power.
Input
Each test case is given by a line of input containing x. The value of x will have magnitude at least 2 and be within the range of a (32-bit) int in C, C++, and Java. A line containing 0 follows the last test case.
Output
For each test case, output a line giving the largest integer p such that x is a perfect p th power.
Sample Input
17
1073741824
25
0
Sample Output
1
30
2
解法一:
素数打表,计算所有素因子个数的最大公约数
解法二:
然而还可以直接计算!!!!
就是要考虑一下精度的问题;
正向结果与反向结果要相同才行;
We say that x is a perfect square if, for some integer b, x = b 2. Similarly, x is a perfect cube if, for some integer b, x = b 3. More generally, x is a perfect pth power if, for some integer b, x = b p. Given an integer x you are to determine the largest p such that x is a perfect p th power.
Input
Each test case is given by a line of input containing x. The value of x will have magnitude at least 2 and be within the range of a (32-bit) int in C, C++, and Java. A line containing 0 follows the last test case.
Output
For each test case, output a line giving the largest integer p such that x is a perfect p th power.
Sample Input
17
1073741824
25
0
Sample Output
1
30
2
解法一:
素数打表,计算所有素因子个数的最大公约数
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int maxn=50009;//只需计算sqrt(三十二位范围内) int prime[maxn+1]; void getprime() { for(int i=2; i<maxn; i++) { if(!prime[i]) prime[++prime[0]]=i; for(int j=1; j<=prime[0]&&(long long)prime[j]*i<maxn; j++) { prime[prime[j]*i]=1; if(i%prime[j]==0) break; } } } int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int solve(int n) { int i; int ans=-1; for(i=1; i<=prime[0]; i++)//这里不可以像求质因子那样将(prime[i]*prime[i]<=n作为判断条件,因为我们这里要计算个数,而不是简单地求出因子! { if(n%prime[i]==0) { int cnt=0; while(n%prime[i]==0) { cnt++; n/=prime[i]; } if(ans==-1) ans=cnt; else ans=gcd(ans,cnt);//直接计算结果,刚开始还傻傻的想着将结果记录下来。。。 } } if(ans==-1) ans=1; if(n<0) { while(ans%2==0)//注意负数的平方不可能是偶数,所以一直减半至结果为一奇数 ans/=2; } return ans; } int main() { int n; getprime(); while(scanf("%d",&n)&&n) { cout<<solve(n)<<endl; } return 0; }
解法二:
然而还可以直接计算!!!!
就是要考虑一下精度的问题;
正向结果与反向结果要相同才行;
#include <stdio.h> #include <cmath> int main(){ int p; int n,i; int t; while(scanf("%d",&n) && n){ if(n>0){ for(i=31;i>=1;i--){ t=(int)(pow(1.0*n,1.0/i)+0.1);//加0.1是为了保证精度误差 p=(int)(pow(1.0*t,1.0*i)+0.1); if(n==p){ printf("%d\n",i); break; } } } else{ n=-n; for(i=31;i>=1;i-=2){//负数就直接计算奇数的幂即可 t=(int)(pow(1.0*n,1.0/i)+0.1);//开指定数的方;如果是1/3则是开立方 p=(int)(pow(1.0*t,1.0*i)+0.1); if(n==p){ printf("%d\n",i); break; } } } } return 0; }
相关文章推荐
- POJ 1730 Perfect Pth Powers(素数筛选法)
- poj 1730 -- Perfect Pth Powers
- POJ-1730-Perfect Pth Powers
- poj 1730 Perfect Pth Powers
- POJ 1730 Perfect Pth Powers
- 【数论】poj1730 Perfect Pth Powers
- poj 1730 Perfect Pth Powers
- poj1730 - Perfect Pth Powers
- POJ-1730 Perfect Pth Powers 解题报告(数论) 最大开方数
- poj1730——Perfect Pth Powers
- [TLE] POJ 1730 Perfect Pth Powers
- POJ 1730 Perfect Pth Powers - 找一个数最多是第几方数...暴力解决...
- (Relax 1.12)POJ 1730 Perfect Pth Powers(在x=b^p的情况下,求最大的p)
- POJ 1730 Perfect Pth Powers (求最大p,x=b^p)
- POJ1730 Perfect Pth Powers (math)
- POJ 1730 Perfect Pth Powers(唯一分解定理)
- Poj 1730 Perfect Pth Powers (数论 GCD)
- poj 1730 Perfect Pth Powers(枚举)
- POJ 1730 Perfect Pth Powers (枚举||分解质因子)
- Poj 1730 Perfect Pth Powers