素数距离问题

描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
输入
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
3
6
8
10
样例输出
5 1
7 1
11 1
思路:

       这道题本身不是太难,但是总总因素的不通过实在头疼,下面的方法借鉴别于别人的博文,用筛选法的方法将1到max之间的数的非素数全部赋1,素数为0,要考虑输入的数极端的条件,比如输入的数为1,则输出2和1,输入999999则输出1000003数组就要定义比1000000还要大一些。

代码:

#include<stdio.h>
#include <math.h>
#define MAX 1000010
int x[MAX]={0}; //放在这里定义不用担心内存出错
void f()  //函数功能:将1到max的数中不为素数的赋1,否则为素数还是为0
{
	int i,j;
	x[1]=1; //第一个数1不为素数赋1
	for (i=2;i<sqrt(MAX);i++)
		if (x[i]!=1)
			for (j=i*2;j<MAX;j=j+i) //排序数的倍数
				x[j]=1;  //将1赋给非素数
			for (i=1;i<10;i++)
				printf("%d ",x[i]);
}
main()
{
	f(); //调用函数,将1到max之间的非素数赋1
	int a,b,c,n,m,s;
	scanf("%d",&s); 
	while (s--)
	{
		scanf("%d",&a);
		if (a==0)
			printf("%d 0\n",a);
		else
		{
			    b=c=a;//用b计算比a大的素数,用c计算比a小的素数
				while (x[b]!=0)
					b++;
				while (x[c]!=0&&c>0)
					c--;
				n=b-a;//n存放大值于输入的数的差值
				m=a-c;//m存放输入的数和小值的差值
				if (c==0)//只有当1的情况下,c才可能为0,
					     //此时的b自增为2,n为1,符合
				printf("%d %d\n",b,n);
					else if (n>=m)//a后面的距离大于等于a前素数的距离,都是输出a前的素数和距离
						printf("%d %d\n",c,m);
					else   //后面距离比前面小,输出后面的素数和距离
						printf("%d %d\n",b,n);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值