在给定的区间 [m,n] 内,是否存在素数 p、q、r(p<q<r),使得 pq+r、qr+p、rp+q 均是素数?
输入格式:
输入给出区间的两个端点 0<m<n≤1000,其间以空格分隔。
输出格式:
在一行中输出满足条件的素数三元组的个数。
输入样例:
输出样例:
/*注:此代码在运行测试点5时会超时,因此不是答案,仅算是提供一种思路(可能更易懂)*/
#include<stdio.h>
//还有一种是math.h进行声明判断素数,网上很容易搜到就不再赘述
int main()
{
int max = 0, min = 0, n = 0, u = 0, x = 0, countf = 0;
int A[1000][2] = { 0 }, B[1000] = { 0 };
/*A数组接受范围内的所有数字,B数组接受A数组内所有素数,先判断范围内的素数再完成q、r、p三个数
是素数的要求*/
scanf("%d%d", &min, &max);
//输入两个数字即是范围
n = max - min + 1;
//n是范围内数字的个数
/*注:1不是素数!!!*/
for (int i = 0; i < n; i++)
{
A[i][0] = min + i;
}
//将范围内的所有数字赋值给A数组
for (int i = 0; i < n; i++)
{
for (int k = 2; k < A[i][0]; k++)
{
int Yu = A[i][0] % k;
if (Yu == 0)
{
A[i][1] = 1;
break;
}
}
}
//判断A数组内的所有素数,这其中A数组的第二行是标记非素数的作用,即标记为1
/*例如
A 2 3 4 5 6 7 8 9
0 0 1 0 1 0 1 1(其中0上面的数字是素数,1上面的数字是非素数)*/
for (int i = 0; i < n; i++)
{
if (A[i][1] == 0 && A[i][0] >= 2)
{
B[u] = A[i][0];
u++;
}
}
//将素数全部赋值在B数组中
int Num_1 = 0, Num_2 = 0, Num_3 = 0;//这三个其实就是题目中的q,r,p
for (int i = 0; i < u - 2; i++)//u-2是因为这个数只能赋值到倒数第三个数
{
Num_1 = B[i];
for (int k = i + 1; k < u - 1; k++)//u-1是因为这个数只能赋值到倒数第二个数
{
Num_2 = B[k];
for (int t = k + 1; t < u; t++)
{
Num_3 = B[t];
int fun[3] = { 0 }, panduan[3] = { 0 };
fun[0] = Num_1 + Num_2 * Num_3;
fun[1] = Num_2 + Num_1 * Num_3;
fun[2] = Num_3 + Num_1 * Num_2;
for (int e = 0; e < 3; e++)
{
for (int r = 2; r < fun[e] / 2; r++)
/*这里必须用fun[e]/2否则测试点2运行超时,还是要给运行400ms内一点面子对吧*/
{
int fun_yu = fun[e] % r;
if (fun_yu == 0)
{
panduan[e] = 1;
break;
}
}
}
if (panduan[0] == 0 && panduan[1] == 0 && panduan[2] == 0)
{
countf++;//计数
}
}
}
}
printf("%d", countf);
return 0;
}