DUDA SOBRE ESTRUCTURAS REPETITIVAS EN ESTE PROBLEMA!! C++

Iniciado por larregui15, 16 Julio 2015, 23:35 PM

0 Miembros y 1 Visitante están viendo este tema.

larregui15

Este problema consiste en encontrar un numero amigo, por ejemplo todos los divisores de 220 sumandos dan 284, y los divisores de 284 dan 220. Claro que no se toma en cuenta el mismo numero.

220 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284
284 = 1 + 2 + 4 + 71 + 142 = 220

Entrada

La entrada consiste de varios casos de prueba hasta fin de archivo. Cada caso de prueba consiste en un número entero <= 1000.

Salida

Por cada caso de prueba imprima en una linea su número amigo. Si no tiene un amigo imprima -1.

Ejemplos de entrada

2  
6  
1298  
5637  
284  
7962  
220

Ejemplos de salida

-1  
6  
-1  
-1  
220  
-1  
284

Lo que hice fue lo siguiente:

Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

int main()
{
   int num, i, sum=0, sum2=0;
   cin >> num;

   for (i=1; i<num; i++) { if (num%i==0) { sum = sum+i;} }

       for (int j=1; j<sum; j++) { if (sum%j ==0) sum2=sum2+j; }

if (sum2 == num) {cout << sum << endl; }
          else {cout << "-1"<< endl; }
       
}

Y EL PROGRAMA ESTA BIEN, PERO AHORA SI PONGO UN WHILE PARA QUE SE REPITA TODO Y ASI PODER HACER LOS 1000 CASOS DE PRUEBA QUE PIDE ... EMPIEZAN A SALIR MAL LOS RESULTADOS, SOLO SALE BIEN EL PRIMER RESULTADO Y DE AHI TODO SALE -1 .. NO SE QUE HACER! AYUDA! POR FAVOR!  

POR QUE ESTO ESTA MAL? COMO DEBERIA DE SER?
Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

int main()
{
   int num, i, sum=0, sum2=0;
   cin >> num;

[b]while (n<=1000)[/b]{
   for (i=1; i<num; i++) { if (num%i==0) { sum = sum+i;} }

       for (int j=1; j<sum; j++) { if (sum%j ==0) sum2=sum2+j; }

if (sum2 == num) {cout << sum << endl; }
          else {cout << "-1"<< endl; }
                 
[b]cin >> num<< endl;    } [/b]

}



[MOD] Usar las etiquetas GeShi, al publicar codigo.

ivancea96

Pon el código. Es posible que no inicializes las variables bien, o que no leas correctamente la entrada.

DarK_FirefoX

Las variables i, sum y sum2 tienes que inicializarlas dentro del while para que tengan su valor inicial por cada caso de prueba




Ahora, por la composición del problema, esto parece sacado de un juez en linea, por lo tanto, la manera de leer los datos no creo que sea la correcta, pues cuando te dicen:

CitarLa entrada consiste de varios casos de prueba hasta fin de archivo. Cada caso de prueba consiste en un número entero <= 1000.

No significa que hayan 1000 casos de prueba, sino que van a haber varios casos de prueba donde cada número que te entren va a ser menor o igual a 1000. Por lo tanto tu tienes que ir leyendo hasta el final del archivo los números e ir mostrando el resultado. Algo así como:

MIENTRAS NO FINAL DEL ARCHIVO
HACER
  INICIALIZAR VARIABLES
  LEER NUMERO
  REALIZAR LAS OPERACIONES
  DAR RESULTADO
FIN MIENTRAS


Espero que entiendas.

Salu2s