Autor
|
Tema: Necesito una ayuda (Leído 2,154 veces)
|
jonyayala95
Desconectado
Mensajes: 9
|
Hola amigos, necesito me ayuden con un problema que estoy tratando de resolver pero que no sale. El problema dice: Se dan dos numeros enteros positivos N y M, el problema es hallar la cantidad de pares de numeros enteros (a,b) con 1<=a<=N y 1<=b<=M y tal que (sqrt(a)+sqrt(b))^2 sea un numero enteroentero. (sqrt(n) es la raiz cuadrada de n). Por ejemplo si N=2 y M=2 la respuesta es 2 (a,b)=(1,1) y (2,2). Se entiende no? Pongo lo que hice yo: Es claro que para que (a,b) cumpla las condiciones sqrt(a*b) tiene que ser entero. (DEMOSTRACION: (sqrt(a)+sqrt(b))^2=(a+2*sqrt(a*b)+b) entonces como a y b son enteros 2*sqrt(a*b) tiene que ser entero, pero a*b es producto de dos enteros entonces para que toda la expresion sea entera (a*b) tiene que ser un cuadrado perfecto que en consecuencia sqrt(a*b) sea entero ).Entonces me armo algo que pruebe todas las multiplicaciones posibles que son en total (M*N) y se fije en cada caso si tiene raiz cuadrada exacta, si lo es que incremente en 1 la cantidad de pares. Pongo mi code, pero no se que estoy haciendo mal: #include<iostream.h> #include<math.h> using namespace std; main(){ int N, M; cin>>N >>M; int a=1,b=1; long int producto=1; int respuesta; for(a=1;a<N;a++){ for(b=1;b<M;b++){ producto=a*b; } } double raizab =sqrt(producto ); if(raizab*raizab==producto){ respuesta++; } cout<<"La cant de pares es " <<respuesta; }
Agradeceria que me ayuden.. Nota: N y M son a lo sumo 77777 EDIT: Agregué la demostracion de por que si sqrt(a*b) es entero implica que el par (a,b) cumple lo pedido.
|
|
« Última modificación: 4 Febrero 2013, 03:03 am por jonyayala95 »
|
En línea
|
|
|
|
dooque
Desconectado
Mensajes: 170
|
Buenas! Primero. No analice la parte matematica, i.e. No me que claro que sqrt(a*b) entero implique (sqrt(a)+sqrt(b))^2 entero. Segundo. Asumiendo que lo de arriba es true, lo que tenes mal es que el codigo:
double raizab=sqrt(producto); if(raizab*raizab==producto){ respuesta++; }
Tiene que estar dentro del for().
Saludos.
(Disculpa la desproligidad, escribo desde un celular :p)
|
|
|
En línea
|
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. -- Kernighan
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
La parte matemática está mal. Esto sería lo que está bien: sqrt(a) * sqrt (b) = sqrt(a * b) sqrt(a) + sqrt(b) = sqrt(a) + sqrt(b) (sqrt(a) +sqrt(b))² = a + b + 2*sqrt(a*b) Esto último es el cuadrado de una suma: cuadrado del primero más el cuadrado del segundo mas el doble del producto del primero por el segundo... Este código que acabo de hacer creo que cumple con eso: #include <iostream> #include <cmath> using namespace std; //Definición de funciones. bool esValido(int N, int M); int main(int argc, char *argv[]) { //Declaración de variables. int N = 0; int M = 0; int contadorN = 1; int contadorM = 1; //Entrada de datos. cout << "Introduce N:" << endl; cin >> N; cout << endl << "Introduce M:" << endl; cin >> M; //Mientras contadorN no llege a N. while(contadorN <= N) { //Comprobamos si la raiz de a más la raiz de b al cuadrado es un número entero. if(esValido(contadorN,contadorM)) { //Si es un número entero desplegamos a y b. cout<<"N: "<< contadorN << endl; cout<<"M: "<< contadorM << endl << endl; } //Si contadorM llega a M aumentamos contadorN para probar con otros valores de N y volvemos a poner contadorM a 1. if(contadorM == M) { contadorN++; contadorM = 1; } else { ++contadorM; } } return 0; } bool esValido( int N,int M ) { float numero = powf(sqrt(N)+sqrt(M),2); if(numero == (int)numero) return true; else return false; }
|
|
« Última modificación: 4 Febrero 2013, 01:34 am por avesudra »
|
En línea
|
Regístrate en
|
|
|
jonyayala95
Desconectado
Mensajes: 9
|
No pero fijate que alcanza con que a*b sea un cuadrado perfecto (porque a y b son enteros, no sucederia lo mismo si a y b fuesen racionales), lo explico en la demostracion...
|
|
|
En línea
|
|
|
|
dooque
Desconectado
Mensajes: 170
|
Si, tenes razon, como a y b son enteros basta con que sqrt(a*b) sea entero, lo que tenes mas es el codigo afuera del for, tiene que estar adentro!
|
|
|
En línea
|
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. -- Kernighan
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
Si tienes razón es verdad, de todas maneras el código que he puesto en el post de arriba me parece que funciona.
¡Un saludo!
|
|
|
En línea
|
Regístrate en
|
|
|
jonyayala95
Desconectado
Mensajes: 9
|
Gracias por sus respuestas, pero no sé que parte de tu code está mal porque al correr el programa me tira algunos pares donde A o B son 0. Probé inicializando las variables en 1 pero tampoco funciona Estamos mas cerca de la solucion...
|
|
|
En línea
|
|
|
|
naderST
|
Si entendí bien, creo que lo siguiente debería funcionar: #include <stdio.h> #include <math.h> int main(int argc, char **argv) { unsigned int n, m, a, b, contador = 0; printf("Introduzca el valor de n: "); printf("Introduzca el valor de m: "); for (a = 1; a >= 1 && a <= n; ++a) for (b = 1; b >= 1 && b <= m; ++b) if (fmod (pow(sqrt(a * b ), 2), 1) == 0) ++contador; printf("Número de pares ordenados: %u\n", contador ); return 0; }
EDIT: #include <stdio.h> #include <math.h> int main(int argc, char **argv) { unsigned int n, m, a, b, contador = 0; printf("Introduzca el valor de n: "); printf("Introduzca el valor de m: "); for (a = 1; a <= n; ++a) for (b = 1; b <= m; ++b) if (fmod (pow(sqrt(a * b ), 2), 1) == 0) ++contador; printf("Número de pares ordenados: %u\n", contador ); return 0; }
|
|
« Última modificación: 4 Febrero 2013, 03:19 am por naderST »
|
En línea
|
|
|
|
jonyayala95
Desconectado
Mensajes: 9
|
Si entendí bien, creo que lo siguiente debería funcionar:
Algo está mal, porque no arroja bien el resultado. Por fin me salió a mi, paso mi code por si alguien puede optimizarlo: #include<iostream.h> #include<math.h> using namespace std; main(){ int N=1, M=1,a=1,b=1,CantdePares=0; cout<<"Ingresa N "; cin>>N; cout<<"Ingresa M "; cin>>M; for(a=1;a<=N;a++){ for(b=1;b<=M;b++){ CantdePares++; } } } cout<<"La cantidad de pares es: " <<CantdePares; return 0; }
Muchas gracias por sus respuestas!
|
|
|
En línea
|
|
|
|
naderST
|
EDIT:
No me queda claro lo de la condición
|
|
« Última modificación: 4 Febrero 2013, 03:34 am por naderST »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Amigos necesito ayuda con un background para un logo de una web ayuda.
Diseño Gráfico
|
™Carlos.®
|
2
|
3,446
|
14 Agosto 2004, 00:23 am
por ™Carlos.®
|
|
|
Necesito ayuda, por favor, necesito eliminar definitivamente un contacto del msn
« 1 2 »
Mensajería
|
jordijor
|
10
|
14,382
|
19 Diciembre 2011, 09:16 am
por A4TECH
|
|
|
[Ayuda] Necesito ayuda para crear un buen video uso AF y Flash.
Diseño Gráfico
|
XXXXXX
|
1
|
5,521
|
11 Noviembre 2009, 00:17 am
por Sub_Cero
|
|
|
Necesito ayuda con mi conexion he conocimientos de red.. alguien me ayuda
Redes
|
molinator
|
1
|
2,392
|
21 Febrero 2011, 14:04 pm
por madpitbull_99
|
|
|
AYUDA!!! Necesito ayuda para descifrar un archivo Ensamblado
Ingeniería Inversa
|
tritritsn
|
1
|
2,623
|
4 Enero 2013, 18:22 pm
por MCKSys Argentina
|
|