[PTA]均是素数

在给定的区间 [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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值