java acm 24题 素数距离问题 解析

来源:互联网 发布:工控机软件 编辑:程序博客网 时间:2024/05/05 02:40


素数距离问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:2
描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
输入
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
36810
样例输出
5 17 111 1

来源
经典题目
上传者
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

3151082
0 0
原创粉丝点击