素数距离问题
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0-
输入
-
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
-
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
-
3 6 8 10
样例输出
-
5 1 7 1 11 1
-
第一行给出测试数据组数N(0<N<=10000)
来源
经典题目
上传者
hzyqazasdf
关于这道题目,很多人都会去考虑怎么去得到两边的素数值,怎么去判断两边的素数。
博主的方法就是利用递归的方法两边跑,两边去判断
import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner scan=new Scanner(System.in); int n=Integer.parseInt(scan.nextLine()); while(n!=0){ int num=scan.nextInt(); if(num<=2) System.out.println("2 "+(2-num)); else if(isPrime(num))//先判断该数字是不是素数,如果是就返回true,如果不是则false; System.out.println(num+" 0"); else{ int big=add(num); int small=plubs(num); if(big-num<num-small)//这里就是比较左边跟右边的素数相距原来的数字距离有多大 System.out.println(big+" "+(big-num)); else if(big-num>=num-small) System.out.println(small+" "+(num-small)); } n--; } } public static boolean isPrime(int n){//判断是否为素数的方法 if (n == 3) return true; else for(int i=2;i<=Math.sqrt(n);i++){ if(n%i == 0) return false; } return true; } public static int add(int num){//向右边跑,不断验证右边的数字,直到是素数为止 for(int i=2;i<=Math.sqrt(num);i++){ if(num%i==0){ num++;//如果他不是素数,就+1,继续往右边跑 return add(num); //利用递归的方法 } } return num; } public static int plubs(int num){//向左边跑,不断验证左边的数字,直到是素数为止 for(int i=2;i<=Math.sqrt(num);i++){ if(num%i==0){ num--;//如果他不是素数,就-1,继续往左边跑 return plubs(num); //利用递归的方法 } } return num; } }
有个很重要的问题有些人可能没发现。
就是当你输入数据为小于2的数的时候,问题就出现了
1它不是素数,所以呢,就要两边去找,0肯定不是,所以就找到了2,然后2距离1的位置是1
所以当你输入1的时候,输出的就必须为 2 1
if(num<=2)//num是输入的数字
System.out.println("2 "+(2-num));
这条语句,就是判断数字小于2的时候作出的处理
最后的用时为 315 1082
315 | 1082 |