![]() |
sumar numeros de una lista
Hola.
Como conseguiriais averiguar en un listado de numeros, que combinacion de numeros suman un valor determinado. Por ejemplo, si tengo un listado con 30 numeros, que combinaciones de numeros suman un total de 986. Gracias |
Cita:
https://craftofcoding.wordpress.com/...-and-an-array/ Usar índices poderá ajudar: Código COBOL:
|
Cita:
Esto se puede resolver de forma recursiva o interactiva. De forma interactiva lo haría de la siguiente forma: - Metería los números en un occurs o tabla. - Buscar combinaciones de 1 elemento. Hasta recorrer la tabla o pasarse de la suma (condicion). - Buscar 2 elementos alternando posiciones, hasta (condición). * * * - Buscar 29 elementos alternando posiciones, hasta condición. - Buscar 30 elementos, hasta condición. O quizas hacerlo justamente al revés. Bonito reto. A ver si tengo un rato y lo implemento. :flipa: |
@JCantero,
No existe ningún algoritmo que haga eso, (que yo sepa), el caso está en que si son la suma de 2 o 3 elementos en una combinación de, por ejemplo 30 elementos, el algoritmo es sencillo y rápido, el problema está en que sean la suma de cualquiera de los 30 elementos, (en el que necesites sólo 1 para que dé ese valor, o necesites los 30, para que lo dé), ahí el problema es que la cantidad de combinanciones, es exponencial al número de elemento, por lo que, en una tabla de 30 elementos, la cantidad de combinaciones sería de 2,6e+32, (30!), osea, 26 seguido 32 ceros, (2.600.000.000.000.000.000.000.000.000.000.000), lo cual, hace imposible el cálculo. Un saludo.- |
Cita:
Creo que no es tanto. Son (2^30)-1 == 1.073.741.823 Bonito reto |
Cita:
|
1 Archivos Adjunto(s)
Cita:
Em anexo projecto em Powercobol para calculo de um factorial e uma solução para o problema: Código COBOL:
|
@Joseg, reto conseguido y muy curiosa la solución.
---------- Post añadido : 14:35 ---------- Post anterior : 14:17 ---------- Va analizando cada combinación en binario. Es decir: 0 1 01 11 001 101 011 111 * * * 1111111111111 (hasta las posiciones que se configuren, en este caso 12) Y va sumando en cada combinacion con los elementos de la lista dada y comprobando si da el resultado buscado. ¡ Muy Curioso ! pero eficiciente. Ya lo he modificado para 30 elementos y lo he puesto en un windows y en un linux, a ver lo que tarda ¡¡¡ :pared: ---------- Post añadido : 20:18 ---------- Post anterior : 14:35 ---------- Para vuestra información y curiosidad. (buscando con 30 elementos) ( 2^30-1 combinaciones) Compilado en RM/cobol y ejecutado en windows y linux. Después de 7 horas esperando: 1) el proceso de windows 10 (64 bits) lleva un 30% 2) el proceso en linux (virtual) con 8 CPUs lleva un 45% He realizado lo mismo en C. Lo he ejecutado en el linux. Ha tardado 2,5 minutos. Ya lo esperaba pero me ha sorprendido tan poco tiempo. Me gustaria que hicierais lo mismo en otros COBOL para ver como son de rápidos en estas cosas. Hacedlo para 30 elementos, modificando el programa de @joseg o os lo envio. Por este motivo yo muchas veces implemento rutinas en C para obtener mejores resultados aunque no sean valorados. :cojo: |
Brutal !!!!!!!!!
Menudos fieras Gracias |
@JCantero, el problema de rendimiento debe venir del hecho que la rutina de @Joseg (a diferencia de tu rutina en C) no usa campos nativos.
Los COMP y COMP-3 deben reemplazarse por unos COMP-5 (de 2-4-8 bytes) para corresponder con la plataforma. Esto acelerará mucho el asunto. |
| La franja horaria es GMT +2. Ahora son las 13:40. |
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.