Trouver le nombre premier (en comptant le tournoi provincial de la Coupe Lanqiao 2019, groupe B, tournoi de simulation 1)

sujet

  	一天蒜头君猜想,是不是所有的偶数(除了 22),都可以用两个质数相加得到呢?于是聪明的蒜头君就找你来验证了。

	输入格式
	第一行输入一个整数 t 表示测试组数。

	接下来 t 行,每行一个整数 n。

	输出格式
	输出两个整数,因为答案可能有多个,所有要求输出的这两个整数是所有答案中字典序最小的。

	数据范围
	对于 30% 的数据 1 ≤ t ≤ 10^3。
	对于 60% 的数据 1 ≤ t ≤ 10^5。
	对于 100% 的数据 1 ≤ 10^6, 4 ≤ n ≤ 10^6 ,n 为偶数。

	样例输入
	3
	4
	8
	20

	样例输出
	2 2
	3 5
	3 17

En raison des données volumineuses de cette question, nous pouvons envisager d'utiliser la méthode de filtrage linéaire des nombres premiers pour les stocker dans le tableau, puis rechercher le tableau à la fin.

Les codes de comptage et de dépôt sont les suivants:

void data()
{
    
    
	ms(a),ms(b);
	for(int i=1;i<=1e6;i++) 
		for(int j=i;j<=1e6;j+=i)
			a[j]++;
			
	for(int i=1;i<=1e6;i++)
		if(a[i]==2){
    
    
			b[l++]=i;
		}
}

L'exigence de la question est de trouver deux nombres premiers qui s'additionnent à n. Nous pourrions aussi bien utiliser la méthode d'énumération, d'abord énumérer un nombre premier i, et chercher dans le tableau si ni sont également des nombres premiers, et s'ils sont satisfaits en même temps, il est conforme à la revendication.

Il convient de noter que, comme il peut y avoir plusieurs ensembles de réponses, l'ordre lexicographique requis est le plus petit (c'est-à-dire le plus petit nombre), donc le cas que nous produisons finalement devrait être l'ensemble des cas d'utilisation avec le plus petit i lorsque conditions.

Le code complet est le suivant:

#include <bits/stdc++.h>
#define ms(a) memset(a,0,sizeof(a))
using namespace std;

int a[1000009];
int b[1000009];
int l=0;

void data()
{
    
    
	ms(a),ms(b);
	for(int i=1;i<=1e6;i++)
		for(int j=i;j<=1e6;j+=i)
			a[j]++;
	
	for(int i=1;i<=1e6;i++)
		if(a[i]==2){
    
    
			b[l++]=i;
		}
			
}

int main()
{
    
    
	l=0;
	data();
	int t,n;
	scanf("%d",&t);
	while(t--)
	{
    
    
		scanf("%d",&n);
		int i=0;
		int x,y;
		while(i<l&&b[i]<=n)
		{
    
    
			x=b[i];
			y=n-x;
			if(a[y]==2) 
				break;
			i++;
		}
		printf("%d %d\n",x,y);
	}
	return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/laysan/article/details/113577455
conseillé
Classement