您的位置:首页 > 其它

NYOJ 24:素数距离问题

2015-09-18 18:46 281 查看


素数距离问题

时间限制: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

对于求素数问题,可以省时优化~~通过打表哦~~~

AC-code:
#include<cstdio>
#include<cmath>
#include<cstring>
#define MAX 1000010
int prime[MAX];
void Prime()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<sqrt(MAX)+1;i++)
if(prime[i])
continue;
else
for(int j=i*i;j<MAX;j+=i)
prime[j]=1;
}
int main()
{
int n,a,l,r,k;
Prime();
prime[1]=prime[0]=1;
scanf("%d",&n);
while(n--)
{
scanf("%d",&a);
//		if(a==0)
//		{
//			printf("1 1\n");
//			continue;
//		}
l=r=a;
k=0;
while(prime[l]&&prime[r])
{
l--;
r++;
k++;
}
if(prime[l])
l=r;
printf("%d %d\n",l,k);
}
return 0;
}
JAVA:

import java.io.*;
import java.math.MathContext;
import java.util.*;

public class Main{
public static void main(String[] args) {

Scanner input = new Scanner(System.in);
int n = input.nextInt();
while((n--)!=0){
int m = input.nextInt();
int i=0;
while(Judge(m+i)&&Judge(m-i)){
i++;
}
if(!Judge(m-i)){
System.out.println((m-i)+" "+i);
}else{
System.out.println((m+i)+" "+i);
}
}

}

public static boolean Judge(int m){
boolean flag = false;
if(m<2) return true;
for(int i=2;i*i<=m;i++){
if(m%i==0){flag=true;break;}
}
return flag; //是素数返回 false

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: