题目:
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
我的代码1:
#include<stdio.h>
int getprimes(int primes[], int N);
int main()
{
int N = 0;
int cnt = 0;
int primes[10000] = { 0 }; //用于存放素数
scanf_s("%d", &N);
getprimes(primes, N);
for (int i = 1; primes[i] != 0; i++)
{
if (primes[i] - primes[i - 1] == 2)
{
cnt++;
}
}
printf("%d", cnt);
}
int getprimes(int primes[], int N) //求出小于N的素数放进数组
{
for (int i = 2; i < N + 1; i++)
{
int isprime = 0;
static int cnt = 0;
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
isprime = 0;
break;
}
else
{
isprime = 1;
}
}
if (isprime == 1)
{
primes[cnt] = i;
cnt++;
}
}
return 0;
}
这样写有个问题是当N比较大时会运行超时,导致测试不通过,原因是 getprime 函数用去的太多时间,需要优化一下算法。于是我搜了一下求素数的优化算法。得
#include<stdio.h>
int getprimes(bool primes[],int N);
int main()
{
int N = 0;
int cnt = 0;
bool primes[100000];
scanf("%d", &N);
for (int i = 0; i < N+1; i++) //把primes用到的值初始化为true
{
primes[i] = true;
}
getprimes(primes,N);
for (int i = 2; i+2 <= N; i++)
{
if (primes[i] && primes[i+2])
{
cnt++;
}
}
printf("%d", cnt);
return 0;
}
int getprimes(bool primes[],int N) //筛法筛选出不大于N的素数
{
for (int i = 2; i < N; i++)
{
if (primes[i])
{
for (int j = i + i; j < N; j += i)
{
primes[j] = false;
}
}
}
return 0;
}
其中筛法求素数详见:(24条消息) 求质数(素数)算法,及算法优化_# Never Give up &-CSDN博客_求素数公式
感谢前辈。