PAT乙级练习 1007.素数对猜想
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
一开始是这样写的:
#include <stdio.h>
int main()
{
int N;
scanf("%d",&N);
if (N>0 && N<100000)
{
int i,j,flag,m=0,M=1;
int a[100000];
for (i=2; i<=N; i++)
{
flag=0;
for (j=2; j<i; j++)
{
if (i%j==0)
{
flag++;
break;
}
}
if (flag==0)
{
a[m]=i;
m++;
M++;
}
}
int Flag=0;
for (i=1;i<M;i++)
{
if (a[i]-a[i-1]==2)
Flag++;
}
printf("%d\n",Flag);
}
else
printf("error!\n");
return 0;
}
这个写法没有问题,运行也是正确的,但是效率太低了,提交的时候会超时,于是改进如下:
#include <stdio.h>
int main()
{
int N;
scanf("%d",&N);
if (N>0 && N<100000)
{
int i,j,flag,m=0,M=1;
int a[100000];
for (i=2; i<=N; i++)
{
flag=0;
for (j=2; j<i; j++)
{
if (i%j==0)
{
flag++;
break;
}
}
if (flag==0)
{
a[m]=i;
m++;
M++;
}
}
int Flag=0;
for (i=1;i<M;i++)
{
if (a[i]-a[i-1]==2)
Flag++;
}
printf("%d\n",Flag);
}
else
printf("error!\n");
return 0;
}