现给定任意正整数N
(<100000),请计算不超过N
的满足猜想的素数对的个数,“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
思路:先对100001内的所有素数进行打表存入一个数组,这实在是太LOW了!!!我们应该只用两个变量first和second来判断素数对的存在以减少内存占用(运行速度无明显差异)!在本题中具体实现为int judge[2] = { 1,1 };int index = 0;if (index > 0&&((index % 2 == 0 && (judge[1] - judge[0] == 2)) || (index % 2 == 1 && (judge[0] - judge[1] == 2))))count++;(初始为1,1是有讲究的,后续代码注释中给出解释)
代码:
#include <stdbool.h>
#include <stdio.h>
int main(void)
{
int judge[2] = { 1,1 };
int index = 0;
int n = 0;
int count = 0;
int div = 0;
int num = 0;
bool flag = true;
scanf("%d", &n);
if (n >1)
{
for (num = 2;num <= n;num++)
{
for (div = 2,flag = true;div * div <= num;div++)
{
if (num % div == 0)
{
flag = false;
break;
}
/*求素数逻辑:1不进入外层循环(false),2、3不进入内层循环(true), 一个非素数数的最小公约数,
必定小于等于其开根号*/
}
if (flag == true)
{
judge[index % 2] = num;
//index控制数组下标,由此反复更改judge[0]和judge[1]
index++;
if ((index % 2 == 0 && (judge[1] - judge[0] == 2)) || (index % 2 == 1 && (judge[0] - judge[1] == 2)))
count++;
/*判断素数对逻辑: 初始化judge[2] = {1,1};防止index == 0时judge[2] = {2,0}使count++,数组下标为0时judge[1] - judge[0]==2,数组下标为1时judge[0] - judge[1]==2*/
}
}
}
printf("%d", count);
return 0;
}