Mi adivina la solución del problema

Mi adivina la solución del problema


【Descripción del problema】

En 1742, el matemático alemán Goldbach propuso la famosa Conjetura de Goldbach: cualquier número par no menor que 4 puede expresarse como la suma de dos números primos. Esta conjetura aún no ha demostrado ser completamente correcta.

Sin embargo, para un número impar mayor o igual a 5, algunos pueden expresarse como la suma de dos números primos y otros no. Dado un número impar mayor o igual a 5, juzgue si se puede descomponer en la suma de dos números primos.

[Formulario de entrada]

La entrada contiene múltiples datos de prueba, cada dato de prueba ocupa una línea, es un entero positivo m, m es un número impar y no es menor que 5 ni mayor que 32767.

[Formulario de salida]
Para cada dato de prueba, si m se puede descomponer en la suma de dos números primos, dé salida sí, de lo contrario dé salida no.

【Entrada de muestra】

21

75

99

113

[Salida de muestra]

No

El significado de la pregunta es muy simple, se trata de juzgar si un número se puede dividir en dos números primos.
El tipo de entrada siempre se ingresa al final del archivo, así que use el método while (cin >> n) para ingresar. Primero mire el
algoritmo violento, la complejidad del tiempo es O (n ^ 3)
(solo mire esta complejidad y sabrá que quiere GG)

#include<iostream>
using namespace std;
int n;
bool judge(int x)//判断是否为素数 
{
    
    
	if(x==2)return true;
	for(int i=2;i<x;i++)
	{
    
    
		if(x%i==0)return false;
	}
	return true;
}
bool check(int a) 
{
    
    
	for(int i=2;i<a/2;i++)//枚举每一种组合 
	{
    
    
		if(judge(i)&&judge(a-i))return true;//只要有一种组合成立,命题成立 
	}
	return false;
}
int main()
{
    
    
	while(cin>>n)
	{
    
    
		if(check(n))cout<<"yes"<<endl;
		else cout<<"no"<<endl;
	}	
} 

Obviamente, la violencia no está permitida (al menos es un problema de algoritmo y no te dará la oportunidad de luchar contra la violencia), así que pide a los estudiantes que dejen de lado la forma de pensar sobre la lucha contra la violencia Inserte la descripción de la imagen aquí
el semestre pasado.

Optimización 1 Conocimiento de teoría numérica
Matemáticas Konjac se avergüenza de venir a balabala para probar algo, simplemente arroje la conclusión:
si un número impar se divide en 2 y otro número, si ambos números son primos, entonces este número se puede dividir en dos La combinación de números primos, y viceversa. Para
decirlo sin rodeos, simplemente juzgue si n-2 es un número primo.
De esta manera, se puede omitir una capa de bucle y la complejidad se optimiza a O (n ^ 2)

#include<iostream>
using namespace std;
int n;
bool judge(int x)//判断是否为素数 
{
    
    
	if(x==2)return true;
	for(int i=2;i<x;i++)
	{
    
    
		if(x%i==0)return false;
	}
	return true;
}
bool check(int a) 
{
    
    
	if(judge(2)&&judge(a-2))return true;//只要有一种组合成立,命题成立 
	return false;
}
int main()
{
    
    
	while(cin>>n)
	{
    
    
		if(check(n))cout<<"yes"<<endl;
		else cout<<"no"<<endl;
	}	
} 

Inserte la descripción de la imagen aquí
Después de optimizar un nivel de bucle, se comprimió con éxito en 1.
Entonces, la pregunta es, ¿puedes optimizarlo un poco?
Optimización 2 Número primo del tamiz + acierto de la tabla
Permítanme explicar el acierto de la mesa. El acierto de la mesa es un término general para un tipo de algoritmo. Calcula aproximadamente algunos datos por adelantado antes de que el programa se ejecute oficialmente . Por ejemplo, para esta pregunta, el Los datos de prueba máximos son solo 32767. Todos los números primos anteriores a 32800 se pueden calcular primero.
El segundo es el número primo del tamiz, que es una forma de escribir esta pregunta. Si utiliza el método convencional para evaluar la calidad, es posible que el reloj se corte antes de que finalice el programa.
Tamizar números primos consiste en enumerar los múltiplos de un cierto número, tamizar todos los múltiplos excepto 1 y el resto son todos números primos.
Por ejemplo, calcule los números primos
del 1 al 20. Tamice los múltiplos de 2
4,
6, 8, 10 , 12, 14, 16, 18, 20 Tamice los múltiplos de 3 6, 9, 12, 15, 18 Tamice múltiplos de 5 10, 15
tamizar 7, 14 múltiplos de 7
. . . . . . . . . .
Al final del tamiz, solo 1 (redondeado hacia abajo), 2, 3, 5, 7, 11, 13, 17, 19. De
esta manera, se pueden calcular los números primos.
Si no le temen a los problemas, incluso puede escribir estos números primos en el código. Esta es la
complejidad en tiempo real de la sincronización de O (n)
Wuhu despegaInserte la descripción de la imagen aquí

#include<iostream>
using namespace std;
int m;
const int N=32800;
int a[N];
void build()//算素数 
{
    
    
        for(int i=2;i<N/2;i++)					         
        {
    
           
        		if(!a[i])             
                for(int j=2;j*i<N;j++)
                {
    
    
                        a[j*i]=1;
                }
        }
}
bool check(int x)
{
    
    
        if(!a[x-2])return true;
        return false;
}

int main()
{
    
    
        build();
        while((scanf("%d",&m))!=EOF)
        {
    
    
                if(check(m))printf("yes\n");
                else printf("no\n");
        }
 }






Supongo que te gusta

Origin blog.csdn.net/fdxgcw/article/details/115045039
Recomendado
Clasificación