//Mejorar quitando el rollo de los primos y simplemente contando productos posibles!! //Versión comentada de cuándo se viola cada condición #include #include using namespace std; int SM=200; int X,Y; bool deprod (int prod, int &k, int &m); bool desum (int suma, int &p, int &n); bool npr (int num); bool prim2 (int x, int y); bool desum2 (int suma, int p, int n2); //void desum3 (int suma, int p, int n2); bool deprod (int prod, int &k, int &m) { k=0; m=0; bool R=false; int x,y,s,sp,sn; for (x=2;x=SM || x*y > prod)//error aquí el >=SM? { if (x==y) { } else { y=SM; } } else { if (x*y==prod) { m++; if (prim2(x,y)) { cout << "Errorxy\n"; } else { s=x+y; if (s>SM) { cout << "ErrorsSM.\n"; } if(!desum(s,sp,sn)||sn==1) { k++; } else { } } } } } } if (m==1) { cout << "Errormprimo\n";//Sería primo y lo sabría, no se cumpliría ni 1 ni 2, puede haber errores si SM es muy pequeño xo no es lógico, p.ej si sm<13, 28=7*4 no puede ser también 14*2 xq el 14 no incluido, y el 2 ya sabría... y el 1 no le podría decir nada antes. R=false; } else { if (k==m-1) { R=true; //cout << "Solucion parcial\n";//luego buscas qué x-y //cout << "El producto cumple la condicion 2.\n"; } else { //cout << "No es s.p\n"; R=false; } } return R; } bool npr (int num) { if (num>=SM) { cout << "errorprim\n"; } if (num==1) { cout << "errorprim, 1 no primo\n"; } bool R=true; int i; for (i=2;i=SM || y >=SM) { cout << "errorprim\n"; } else { if (npr(x)&&npr(y)) { R=true; } else { } } return R; } bool desum (int suma, int &p, int &n) { p=0; n=0; bool R; int x,y,w,z,k=0,pr; if (suma>=SM) { cout << "Errorsusm\n"; } for (x=2;x=SM) { if (x==y) { } else { y=SM; } } else { if (x+y==suma) { n++; //cout << x << "\t" << y << "\t" << suma << "\t" << n << endl; if (prim2(x,y)) { p++; } else { pr=x*y; k=0; for (w=2;w=SM|| z*w >pr) { //k=2; if (z==w) { } else { z=SM; } } else { if (z*w==pr) { k++; //cout << pr << "\t" << x << "\t" << y << "\t" << k << endl; } } } } /*if((x*y)==42) { cout << "aqui" << k << endl; }*/ //cout << k << endl; if (k==1) { //cout << "aqui" << x << "\t" << y << endl; p++; } } } } } } //cout << suma << "\t" << p << "\t" << n << endl; if (p==0&&n!=1) { R=true; } else { R=false; } return R; } /*void desum3 (int suma, int p, int n2) { if(p!=0) { cout << "error\n"; } int x,y,v,vk,m,n=0,q=0; for (x=2;x=SM) { } else { if (x+y==suma) { n++; v=x*y; //cout << endl << x << "\t" << y << "\t" << v << endl; if(deprod(v,vk,m)) { //cout << v << "\t" << vk << "\t" << m << endl; cout << "x= " << x << "\t" << "y= " << y << endl; cout << "La suma es = " << x+y << "\t" << "y el producto = " << x*y << endl; } else { //cout << v << "\t" << vk << "\t" << m << endl; q++; } if (m==1) { cout << "Errorm\n"; } } } } } if (n2!=n) { cout << "Errorn2n\n"; } p=q; //cout << suma << "\t" << p << "\t" << n << endl; }*/ bool desum2 (int suma, int p, int n2) { if(p!=0) { cout << "error\n"; } bool R; int x,y,v,vk,m,n=0,q=0; for (x=2;x=SM) { if (x==y) { } else { y=SM; } } else { if (x+y==suma) { n++; v=x*y; //cout << endl << x << "\t" << y << "\t" << v << endl; if(deprod(v,vk,m)) { //cout << v << "\t" << vk << "\t" << m << endl; X=x; Y=y; } else { //cout << v << "\t" << vk << "\t" << m << endl; q++; } if (m==1) { cout << "Errorm\n"; } } } } } if (n2!=n) { cout << "Errorn2n\n"; } p=q; //cout << suma << "\t" << p << "\t" << n << endl; if (p==n-1) { R=true; } else { R=false; } return R; } int main() { int z=0,w,wp,wn; cout << "Un profesor da al alumno S una suma w y al alumno P un producto v de nos numeros x,y distintos entre si, mayores ambos que uno. Asimismo la suma es menor que SM = 100.\n"; cout << "Los alumnos se llaman y el S le dice al P: Yo no se la solucion (condicion 01), pero se tambien con certeza que tu tampoco puedes saber la solucion (condicion 1). La condicion 0 implica que w se puede descomponer N combinacion de x+y distintos donde N>1. La condicion 1 (que implica la 01) implica que todos los N productos x*y en cada descomposicion de w tienen M posibles factorizaciones, donde M>1.\n"; cout << "Tras oir a S, P le contesta: Ah, entonces ya se cual es la solucion (condicion 2). Esto implica que el producto v tiene L descomposiciones x'*y' donde solo una de ellas tiene la propiedad que su suma w'=x'+y' cumpla la condicion 1.\n"; cout << "Tras oir a P, S le contesta: Anda, pues ya se cual es mi solucion (condicion 3). Esto implica que de las N descomposiciones de la suma, solo uno de sus correspondientes productos cumple la condicion (2).\n"; cout << "\nIntroduce valor maximo (se sugiere 100) de la suma SM = "; cin >> SM; cout << endl; for (wn=0,wp=0,w=5;w1) { cout << "es multiple.\n"; } } } cout << endl << endl; system("Pause"); return 0; }