题目链接:
https://nuoyanli.com/contest/27/problem/G
题面:
题意:
先输入一个T代表T组输入,再输入x,y两个数,判断是否满足x-y的差值可以由p个素数组成,若可以,则输出YES,否则NO。
思路:
这道题目要注意的地方有两点
1.因为题面中说到x,y的取值范围为1到1e9,数值过大,如果直接使用双重for循环就会容易RE,所以我们需要减少时间复杂度,就通过对z开根号来减少计算的次数,这就是这道题目的难点和考点。
2.首先要特判差值为差值为1,2,3的情况。1是不为素数的数,其次因为当z开根号时,2,3的根号都大于1,小于2,所以要对其进行特判。
参考代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
long long x,y,z,i,j,r=0,k;
scanf("%lld %lld",&x,&y);
z=x-y;
if(z==1)
{
printf("NO\n");
continue;
}
if(z==2)
{
printf("YES\n");
continue;
}
if(z==3)
{
printf("YES\n");
continue;
}//特判1,2,3的情况
for(i=2; i<=sqrt(z); i++)
{
if(z%i==0)//判断是否存在一个数可以将z整除
{
k=i;//将i的值赋给k,之后就对k的值进行处理
break;
}
}
for(i=2; i<=sqrt(k); i++)
{
if(k%i==0)//判断这个将z整除的数k是否为素数
{
r=1;//若k能被整除就证明其不是素数,对其进行标记
break;
}
}
if(r==0)//当r=0时,则没有进行r=1的操作,该数为素数
{
printf("YES\n");
}
else//当r=1时,则整除i的数不为素数,不满足题意
{
printf("NO\n");
}
}
return 0;
}