超级素数幂 java

链接:https://www.nowcoder.com/questionTerminal/fb511c3f1ac447309368d7e5432c6c79
来源:牛客网

如果一个数字能表示为p^q(^表示幂运算)且p为一个素数,q为大于1的正整数就称这个数叫做超级素数幂。现在给出一个正整数n,如果n是一个超级素数幂需要找出对应的p,q。

输入描述:

输入一个正整数n(2 ≤ n ≤ 10^18)

输出描述:

如果n是一个超级素数幂则输出p,q,以空格分隔,行末无空格。
如果n不是超级素数幂,则输出No

输入例子:

27

输出例子:

   3 3

 

分析:此题分为两部分,首先考虑n是否能转化为p^q的形式,其次判断P是否为素数。

    1.利用pow()函数进行开方,q的值最小为2最大为sqrt(n);

    2.素数是大于1的自然数中,除了1和它本身以外不再有其他因数的数。所以除了2以外的偶数都不是素数,这样可以筛选掉一部分数。

      • 判断p是否为素数,需要除以从2~sqrt(p)的数都不整除。
      • 或者从第1个素数开始添加到一个集合中,后面的只需要判断是否能整除小于自己的素数即可。
      • import java.util.Scanner;
        
        public class Main {
        
            public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                long num=sc.nextLong();
                double p=0;
                boolean flag=false;
                for(long q=2;q<=(long)Math.sqrt(num);q++){
                    p=Math.pow((double)num,1d/q);
                    if((long)p==p&& prime((long)p)){
                        System.out.println((long)p+" "+q);
                        flag=true;
                        break;
                    }
                }
                if(!flag) {
                    System.out.println("No");
                }
            }
            public static boolean prime(long n){
                if(n%2!=0||n==2){
                    for(long j=2;j<=(long)Math.sqrt(n);j++){
                        if(n%j==0&&n!=2) return false;
                    }
                    return true;
                }
                return false;
            }
        }

         

                  
posted @ 2017-03-09 23:02  寸寸君  阅读(827)  评论(0编辑  收藏  举报