超级素数幂

Posted ~寸寸君的园子~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超级素数幂相关的知识,希望对你有一定的参考价值。

链接: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;
            }
        }

         

                  

以上是关于超级素数幂的主要内容,如果未能解决你的问题,请参考以下文章

每日编程-20170310

间接的快速幂——372. 超级次方

超级有用的9个PHP代码片段

超级素数

Pseudoprime numbers POJ 3641(快速幂)

POJ3641 Pseudoprime numbers(快速幂+素数判断)