Mi solucion Ejercicio 1 nacional 2012 nivel 2
Mi solucion del ejercicio 1 que dice
Encontrar tres numeros enteros posirtivos X , Y , Z tales que entre el mayor y el menor de
ellos la diferencia no es mayor que 5 y ademas X * 2159 + Y * 1779 + Z * 1149 = 218630
#include <iostream> #include <vector> #include <cstdlib> using namespace std; // solucion de Ariel Nowik //Encontrar tres numeros enteros posirtivos X , Y , Z tales que entre el mayor y el menor de //ellos la diferencia no es mayor que 5 y ademas X * 2159 + Y * 1779 + Z * 1149 = 218630 // funcion para sacar el mayor y el menor de una lista (vector) de valores vector <int> mayor_menor(vector <int> numeros,int len){ int mayor = 0; int menor = 1000000; for (int x = 0;x < len;x++){ if (numeros[x] > mayor){ mayor = numeros[x]; } } for (int x = 0;x < len;x++){ if (numeros[x] < menor){ menor = numeros[x]; } } vector <int> mm; mm.push_back(mayor); mm.push_back(menor); // se devuelve una lista (vector) de dos valores, el mayor y el menor return mm; } // funcion de numeros al azar int random(int start = 0,int stop = 1){ stop = stop - 1; unsigned int iseed = (unsigned int)time(NULL); srand (iseed); int ran = rand(); return float(ran) / float(RAND_MAX) * (stop-start) + start; } // funcion main int main(){ int soluciones = 0; vector < vector <int> > list_sol; // revisamos x hasta que x * 2159 supere el valor de la suma*/ for (int x = 0;x*2159 < 218630;x++){ // revisamos y hasta que y*1779 supere el valor de la suma menos lo ya gastado de la suma por x * 2158 */ for (int y = 0;y*1779 < 218630-x*2159;y++){ // revisamos si se puede dividir por 1149 el valor de la suma menos lo gastado por x * 2159 y y * 1779*/ if ((218630 - x * 2159 - y * 1779) % 1149 == 0){ // si se puede deducimos cuanto vale z puesto que si lo multiplicamos por 1149 es lo que falta sumar para sumar el valor de la suma*/ int z = (218630 - x * 2159 - y * 1779 )/ 1149; // hacemos un vector (una lista, un arreglo infinito) donde ubicamos x ,y, z */ vector <int> nums; nums.push_back(x); nums.push_back(y); nums.push_back(z); // llamanos a la funcion mayor menor que pone en un vector, como valor 0 el mayor // numero y como valor 1 el menor vector <int> mm = mayor_menor(nums,3); // revisamos si la diferencia entre el mayor y el menor no es mayor a 5 if (mm[0] - mm[1] >= -5 and mm[0] - mm[1] <= 5){ soluciones ++; // imprimimos la solucion cout<<"-------------------------------------"<<endl; cout<<"SOLUCION "<<soluciones<<" :"<<endl; cout<<"X = "<<x<<" ; X * 2159 = "<<x*2159<<endl; cout<<"Y = "<<y<<" ; Y * 1779 = "<<y*1779<<endl; cout<<"Z = "<<z<<" ; Z * 1149 = "<<z*1149<<endl; cout<<"X * 2159 + Y * 1779 + Z * 1149 = "<<x*2159+y*1779+z*1149<<endl; cout<<"------------------------------------"<<endl; // almacenamos la solucion list_sol.push_back(nums); } } } } // imprimimos una solucion al azar cout<<"RTA: hay "<<soluciones<<" soluciones"<<endl; int num = random(0,soluciones); cout<<"------------------------------------"<<endl; cout<<"SOLUCION AL AZAR (ID = "<<num<<") : "<<endl; cout<<"X = "<<list_sol[num][0]<<" ; X * 2159 = "<<list_sol[num][0]*2159<<endl; cout<<"Y = "<<list_sol[num][1]<<" ; Y * 1779 = "<<list_sol[num][1]*1779<<endl; cout<<"Z = "<<list_sol[num][2]<<" ; Z * 1149 = "<<list_sol[num][2]*1149<<endl; cout<<"X * 2159 + Y * 1779 + Z * 1149 = "<<list_sol[num][0]*2159+list_sol[num][1]*1779+list_sol[num][2]*1149<<endl; cout<<"------------------------------------"<<endl; cout<<"escriba algo y presione enter para continuar . . ."<<endl; int h; cin>>h; }
Salida del programa:
------------------------------------
RTA: hay 1 soluciones
------------------------------------
SOLUCION AL AZAR (ID = 0) :
X = 43 ; X * 2159 = 92837
Y = 41 ; Y * 1779 = 72939
Z = 46 ; Z * 1149 = 52854
X * 2159 + Y * 1779 + Z * 1149 = 218630
------------------------------------
Una sola solucion aparentemente