好长时间不写了,萌新我又回来啦,在通往大佬上的路上走得那叫一个艰难啊。
最近练了一些题,有一道和素数有关,就想分享一下这道PTA上的基础题(对,我还在打基础,因为我现在刚大一),因为之前写过一个判断素数的代码,但是那种太麻烦,只适用于小的数,一旦数值过大就超时了,看了一篇文章(https://blog.csdn.net/qq_41938259/article/details/86321379)
(TIM往事如风33470348 博主写的)学会了打暴力素数表(当然自己改了一下,他是用c++写的,我还不会,就改成了c(其实c和c++差不多,不要对它们产生什么误解,只是有些地方的用法不太一样)),就试了一下,话不多说,上题。
1007 素数对猜想 (20 分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
#include<stdio.h>
#include<math.h>//因为要用到数学开方函数
int su(int n)
{
int sqr=(int)sqrt(1.0*n);/*为什么要开方,举个例子,比如说100这个数,都知道它不是素数。将它开方后是10,你可以知道1*100=100,2*50=100,4*25=100,5*20=100,10*10=100,再之后就是20*5=100,是之前的相反过程,那么可以看出在10以内的数都有一个比较大的数与之对应,所以只需求到开方即可*/
for(int i=2;i<=sqr;i++)
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int i,N;
scanf("%d",&N);
int num=0;
int a[10000],j,count=0;
j=1;
for(i=2;i<=N;i++)
{
num=su(i);
if(num==1)
{
a[j]=i;
j++;
count++;
}
}/*打出素数表*/
int m=0;
for(j=count;j>0;j--)
{
if(a[j]-a[j-1]==2&&j!=1)
{
m++;
}
}
printf("%d\n",m);
return 0;
}
推荐大家一本书,如果想比较好的理解一些代码,算法之类的东西,
《啊哈算法》,我个人感觉比较好用。