Resolver un problema de lógica

Debido a que S conoce la suma de dos números, pero se infiere que P no conoce los dos números, la suma de los dos números S no debe dividirse en la suma de dos números primos, es decir, M y N no pueden ser ambos. Números primos. No habrá números primos mayores que 50; de lo contrario, m * n se puede descomponer de forma única y P puede conocer M y N conociendo el producto de M y N.

pLa información que se puede juzgar del discurso de S es:

1. m y n no serán ambos números primos;

2. No habrá números primos mayores que 50 en m y n;

3. La suma de myn no se puede dividir por la suma de dos números primos;

4. Como S no sabe cuáles son estos dos números, la suma de estos dos números debe ser menor que 99+98; de lo contrario, S sabrá cuáles son estos dos números.

S=m+n que cumple las condiciones anteriores tiene las siguientes posibilidades:

11

17

23

27

29

35

37

41

47

196

Entonces p calcula inmediatamente myn basándose en p=m*n que domina, lo que indica que p=m*n es un número especial con las siguientes propiedades:

Según esta P especial, cuando S toma el valor anterior, solo hay un valor de S que hace que la ecuación sea verdadera

m+n=s,

m*n=p

tiene una solución entera única.

La p calculada en base a esta propiedad tiene las siguientes condiciones (asumiendo m

p = 18, s= 11, m = 2, n = 9

p = 24, s= 11, m = 3, n = 8

p = 28, s= 11, m = 4, n = 7

p = 50, s= 27 , m = 2, n = 25

p = 52, s= 17, m = 4, n = 13

p = 54, s= 29, m = 2, n = 27

p = 76, s= 23, m = 4, n = 19

p = 92, s= 27, m = 4, n = 23

p = 96, s= 35, m = 3, n = 32

p = 100, s= 29, m = 4, n = 25

p = 110 , s= 27, m = 5, n = 22

p = 112, s= 23, m = 7, n = 16

p = 114, s= 41, m = 3, n = 38

p = 124, s= 35, m = 4, n = 31

p = 130, s= 23, m = 10, n = 13

p = 138, s= 29, m = 6, n = 23

p = 140, s= 27, m = 7, n = 20

p = 148, s= 41, m = 4, n = 37

p = 150, s= 35, m = 5, n = 30

p = 152, s = 27, m = 8, n = 19

p = 154, s= 29, m = 7, n = 22

p = 160, s= 37, m = 5 , n = 32

p = 162, s= 27, m = 9, n = 18

p = 168, s= 29, m = 8, n = 21

p>

p = 170, s= 27, m = 10, n = 17

p = 172, s= 47, m = 4, n = 43

p = 174, s= 35, m = 6, n = 29

p = 176, s= 27, m = 11, n = 16

p = 182, s= 27 , m = 13, n = 14

p = 186, s= 37, m = 6, n = 31

p = 190, s= 29, m = 10, n = 19

p = 196, s= 35, m = 7, n = 28

p = 198, s= 29, m = 11, n = 18

p = 204, s= 29, m = 12, n = 17

p = 208, s= 29, m = 13, n = 16

p = 216 , s= 35, m = 8, n = 27

p = 232, s= 37, m = 8, n = 29

p = 234, s= 35, m = 9, n = 26

p = 238, s= 41, m = 7, n = 34

p = 246, s= 47, m = 6, n = 41

p = 250, s= 35, m = 10, n = 25

p = 252, s= 37, m = 9, n = 28

p = 270, s= 37, m = 10, n = 27

p = 276, s= 35, m = 12, n = 23

p = 280, s = 47, m =

7, n = 40

p = 288, s= 41, m = 9, n = 32

p = 294, s= 35, m = 14, n = 21

p = 304, s= 35, m = 16, n = 19

p = 306, s= 35, m = 17, n = 18

p = 310, s= 41, m = 10, n = 31

p = 322, s= 37, m = 14, n = 23

p = 336, s= 37, m = 16, n = 21

p = 340, s= 37, m = 17, n = 20

p = 348, s= 41, m = 12, n = 29

p = 364, s= 41, m = 13, n = 28

p = 370, s= 47, m = 10, n = 37

p = 378, s= 41, m = 14, n = 27

p = 390, s= 41, m = 15, n = 26

p = 396, s= 47, m = 11, n = 36

p = 400, s= 41, m = 16, n = 25

p = 408, s= 41, m = 17, n = 24

p = 414, s= 41, m = 18, n = 23

p = 418, s= 41, m = 19, n = 22

p = 442, s= 47, m = 13, n = 34

p = 462, s= 47, m = 14, n = 33

p = 480, s= 47, m = 15, n = 32

p = 496, s= 47, m = 16, n = 31

p = 510, s= 47, m = 17, n = 30

p = 522, s= 47, m = 18, n = 29

p = 532, s= 47, m = 19, n = 28

p = 540, s= 47, m = 20, n = 27

p = 546, s= 47, m = 21, n = 26

p = 550, s= 47, m = 22, n = 25

p = 552, s= 47, m = 23, n = 24

p = 9604, s = 196, m = 98, n = 98

Finalmente, después de que P dijo que ya conocía M y N, S también dijo que conocía M y N. Esto muestra que S puede obtenga la La suma de dos números infiere los únicos M y N.

Por lo tanto, es necesario eliminar el uso repetido de S en la situación anterior y se obtiene la siguiente situación:

p = 52, s = 17, m = 4, n = 13

p = 9604, s = 196, m = 98, n = 98

Si m

m=4, n=13

El programa es el siguiente:

# include & ltiostream.h & gt

# include & ltfstream.h & gt

# include & ltstring.h & gt

const int MAX _ N = 99

const char * OUTPUT _ FILE = " resultado . txt "; _ N * 2];

int p[MAX _ N * MAX _ N];

int prim[MAX _ N]

int prim contador; = 0;

ofstream fout (archivo de salida);

//Calcular números primos

void calPrim()

{

bool[MAX _ N];

int i, p = 2;

bool encontrado = verdadero

prim[prim contador++]= 2;

memset( usado, falso, tamaño de(usado));

mientras(buscar){

for(I = p;i<MAX_N;i++)

if(i % p == 0)

usado[I]= verdadero;

encontrado=false;

for( I = p; i & ltMAX _ N; i++)

if (!used[i]) {

p = I;

prim[prim contador++ ]= p;

Descubrir = verdadero

Romper

}

}

}

//Filtro basado en la condición 1

void useCon_1()

{

int i, j

memset(s, 0 , tamaño de(s));

for(I = 0;i<4;i++)s[I]=-1;

cal prim();

// S puede estar seguro de que P no sabe cuáles son estos dos números.

for(I = 0;i & ltprimCounteri++)

for(j = I;j & ltprimCounterj++) {

if(prim[I]+prim [j]<MAX_N * 2)

s[prim[I]+prim[j]]=-1;

}

para( I = 0;i<primCounteri++)

if(prim[I]>MAX_N/2)break;

for(I-i<primCounteri++)

p>

for( j = 2; j & ltMAX _ N; j++)

s[prim[I]+j]=-1;

//Porque S no sé cuáles son dos números son.

for(I = 98+99;i<MAX_N+MAX_N;i++)

s[I]=-1;

fout & lt& lt"Encontrar el suma de los dos números en la primera oración de S. "

for(I = 0;i& ltMAX _ N * 2;i++)

if( s[i] == 0)

fout & lt& ltI& lt& ltendl

}

//Filtro basado en la condición 2

void useCon_2()

{

int i, m, n;

memset( p, 0, tamaño de(p)); 2; m & ltMAX _ N; m++)

for(n = 2; n & ltMAX _ N; n++) {

if(s[ m+n]& gt; = 0 ) {

p[m * n]++;

}

}

fout & lt& lt"El producto de dos números que satisface la primera oración de P:"

for(I = 0;I& ltMAX _ N * MAX _ Ni++)

if ( p[i] == 1 || p[i] == 2 ) {

for(m = 2; m & ltMAX _ N; m++)

for(n = m;n & ltMAX _ N ;n++)

if(m * n = = I &&s[m+n]& gt;= 0 ) {

fout & lt& lt" p = " & lt& lti

& lt& lt", s = " & lt& ltm + n

& lt& lt", m = " & lt& ltm

& lt& lt" , n = " & lt& ltn & lt& ltendl

s[m+n]++;

}

}

}

void useCon_3()

{

int i, m, n

fout & lt& lt"El resultado que satisface el segunda oración de S:"

for(I = 0;I<MAX _ N * MAX _ Ni++)

if( p[ i] == 1 || p[i] = = 2 ) {

for(m = 2; m & ltMAX _ N; m++)

for(n = m; n & ltMAX _ N;n++)

if(m * n == I & amperios[m + n] == 1 ) {

fout & lt& lt" p = " & lt& lti

& lt& lt", s = " & lt& ltm + n

& lt& lt", m = " & lt& ltm

& lt& lt", n = " & lt& ltn & lt& ltendl

}

}

}

anular principal( )

{

useCon_1();

useCon_2();

useCon_3()

p>

}