题目:
让我们定义d
n
为:d
n
=p
n+1
−p
n
,其中p
i
是第i个素数。显然有d
1
=1,且对于n>1有d
n
是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<10
5
),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
分析
掌握求素数的方法
代码如下
#include<stdio.h>
#include<math.h>
// 调用sqrt需要的头文件
int main(){
int n;
scanf("%d",&n);
// 输入数据
int temp=2;
// 第一个素数
int sum=0;
// 计数器,计算有几对符合条件的数
int i,j,k,r;
// i用来检测测试的范围,j来代表因子的范围,k表示最大因子,r来判断是否为素数
for(i=3;i<=n;i++){
// 注意等号
k=(int)sqrt(i);
// 注意int
r=1;
// 不可丢!!!!
for(j=2;r&&j<=k;j++){
// r&&j<=k中的r增加代码的效率,注意此处=不可丢
r=i%j;
}
if(r){
// printf("%d\n",i);
// 可用来检测素数的求解的真确性
if(i-temp==2){
sum++;
// 符合条件对数+1
// temp=i;注意这句代码不在这
}
temp=i;
// 素数的变换
}
}
printf("%d\n",sum);
}
注意点
注意点一
这个地方的r=1不可丢,因为上一次r的值可能会影响下一次的r
测试如下
#include<stdio.h>
#include<math.h>
// 调用sqrt需要的头文件
int main(){
int n;
scanf("%d",&n);
// 输入数据
int temp=2;
// 第一个素数
int sum=0;
// 计数器,计算有几对符合条件的数
int i,j,k,r;
// i用来检测测试的范围,j来代表因子的范围,k表示最大因子,r来判断是否为素数
for(i=3;i<=n;i++){
// 注意等号
k=(int)sqrt(i);
// 注意int
// r=1;
// 不可丢!!!!
for(j=2;r&&j<=k;j++){
// r&&j<=k中的r增加代码的效率,注意此处=不可丢
r=i%j;
}
if(r){
printf("%d\n",i);
// 可用来检测素数的求解的真确性
if(i-temp==2){
sum++;
// 符合条件对数+1
// temp=i;注意这句代码不在这
}
temp=i;
// 素数的变换
}
}
printf("%d\n",sum);
}
可见上一次的值若r为0则后续就有问题了
正确的情况如下:
#include<stdio.h>
#include<math.h>
// 调用sqrt需要的头文件
int main(){
int n;
scanf("%d",&n);
// 输入数据
int temp=2;
// 第一个素数
int sum=0;
// 计数器,计算有几对符合条件的数
int i,j,k,r;
// i用来检测测试的范围,j来代表因子的范围,k表示最大因子,r来判断是否为素数
for(i=3;i<=n;i++){
// 注意等号
k=(int)sqrt(i);
// 注意int
r=1;
// 不可丢!!!!
for(j=2;r&&j<=k;j++){
// r&&j<=k中的r增加代码的效率,注意此处=不可丢
r=i%j;
}
if(r){
printf("%d\n",i);
// 可用来检测素数的求解的真确性
if(i-temp==2){
sum++;
// 符合条件对数+1
// temp=i;注意这句代码不在这
}
temp=i;
// 素数的变换
}
}
printf("%d\n",sum);
}
判断素数的另一种写法
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
int i,j,k,sum=0;//sum用来记录对数
int temp=2;//已知最小素数为2;
for(i=3;i<=n;i++)//求素数的方法
{
k=(int)sqrt(i);
for(j=2;j<=k;j++)//切记是j<=k,等号一定不可以掉
{
if(i%j==0)
{
break;
}
}
if(j>k)//表明为素数
{
if(i-temp==2)//表明两素数相差为2
{
sum++;//计对器
}
temp=i;
}
}
printf("%d\n",sum);
}