nyoj24-素数 距离问题

素数距离问题

时间限制: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>
int main()
{ int s(int x);
	int n;
	scanf("%d",&n);
	while(n--)
	{
		int m,a,b,i;
		scanf("%d",&m);
		if(s(m))
		printf("%d 0\n",m);
		else
		for(i=1;i<m;i++)
		{
			if(s(m-i))
			{
				printf("%d %d\n",m-i,i);
				break;
			}
			else if(s(m+i))
			{
				printf("%d %d\n",m+i,i);
				break;
			}
		}
	}
	return 0;
}
int s(int x)
{
	int i,t=1;
	for(i=2;i<x;i++)
	{
		if(x%i==0)
	{
			t=0;
		break;}
	}
	return t;
	}	
	
下面是最优程序:
 
#include<iostream>
#include<cmath>
using namespace std;

bool isprime(int n)
{
	for(int k=2;k<=sqrt((double)n);k++)
		if((n%k)==0)
			return false;
	return true;
}
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int num,i,j;		
		cin>>num;
		if(num==1)
		{
			cout<<"2 1"<<endl;
			continue;
		}
		for(i=num;!isprime(i);i--);	
		for(j=num;!isprime(j);j++);	
		
		if((num-i)<(j-num))
			cout<<i<<' '<<(num-i)<<endl;
		else if((num-i)>(j-num))
			cout<<j<<' '<<(j-num)<<endl;
		else if((num-i)==(j-num))
			cout<<i<<' '<<(num-i)<<endl;
	}
}        


posted @ 2018-03-24 21:43  浮生惘语  阅读(102)  评论(0编辑  收藏  举报