导航

NYOJ 24-素数距离问题

Posted on 2013-07-24 09:47  勇敢的炮灰  阅读(132)  评论(0)    收藏  举报

点击打开链接

素数距离问题

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

这次使用的线性筛选发,速度比普通的筛选更快,依据的原理就不说了,步骤就是用一个数组把当前的素数全纪录下来,然后用当前循环到的数乘以纪录过的素数,然后把结果也标记一下就行

 
 
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int array2[1000004];
int sushu[100000];
int top;

int main()
{
	array2[1] = array2[0] = 1;
	int k , j , i;
	for(i = 2 ; i < 1000004 ; i++)
	{
		if(array2[i] == 0)
			sushu[top ++] = i;
		for(j = 0 ; j < top && i * sushu[j] < 1000004; j++)
		{
			array2[i * sushu[j]] = i;
			if(i == sushu[j] )
				break;
		}
	}
	
	scanf("%d" , &i);


	while(i--)
	{
		scanf("%d" , &j);
		for(k = 0 ; ; k++)
		{
			if(array2[j - k] == 0)
			{
				printf("%d %d\n" , j - k , k);
				break;
			}
			if(array2[j + k] == 0)
			{
				printf("%d %d\n" , j + k , k );
				break;
			}
		}
	}

	return 0;
}