原题 (水题
基本思路
- 埃氏筛,求出
2~n
中的所有素数;
bool isprime[10005];
void esPrime(int n)
{
memset(isprime, true, sizeof(isprime));
isprime[1] = false;
for (int i = 2; i*i <= n; i++)
{
if (isprime[i])
{
for (int j = i*i; j <= n; j += i)
isprime[j] = false;
}
}
}
- 将素数存入另一个数组
prime[10005]
;
int i, j;
int prime[10005];
for (i = 1, j = 0; i <= n; i++)
{
if (isprime[i])
prime[j++] = i;
}
- 将符合条件的素数对一一打印;
for (i = 0; i < j; i++)
{
if (prime[i + 1] - prime[i] == 2)
printf("%d %d\n", prime[i], prime[i + 1]);
}
- 找不到任何素数对所符合的范围,经暴力得出,直接打印
no
;
if (n == 0 || n == 1 || n == 2 || n == 3 || n == 4)
printf("no");
- 完整代码;
#include <cstdio>
#include <cstring>
const int MAX = 10005;
int n, prime[MAX];
bool isprime[MAX];
void esPrime(int n)
{
memset(isprime, true, sizeof(isprime));
isprime[1] = false;
for (int i = 2; i*i <= n; i++)
{
if (isprime[i])
{
for (int j = i*i; j <= n; j += i)
isprime[j] = false;
}
}
}
void judge_input_Prime()
{
int i, j, q;
for (i = 1, j = 0; i <= n; i++)
{
if (isprime[i])
prime[j++] = i;
}
for (i = 0, q = 0; i < j; i++)
{
if (prime[i + 1] - prime[i] == 2)
printf("%d %d\n", prime[i], prime[i + 1]);
}
}
int main()
{
scanf("%d", &n);
if (n == 0 || n == 1 || n == 2 || n == 3 || n == 4)
printf("no");
esPrime(n);
judge_input_Prime();
return 0;
}