Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol COBOL - General
COBOL - General Discusiones de temática general sobre el lenguaje COBOL y todo lo relacionado con él.
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Duda] Sumar decimales Socavi COBOL - General 19 5 de enero de 2023 17:51
[Sintaxis] Ejemplo guardar lista de archivos luisbago RM/COBOL 7 18 de mayo de 2022 15:58
[Sintaxis] Identificacion de numeros en una cadena Breew PowerCOBOL (ActiveX, v4 - v11) 2 4 de noviembre de 2018 19:47
Traductor de números a letras. Gusaiello Cocina AcuCOBOL 2 22 de mayo de 2018 20:45
[Componente] Rutina Números Aleatorios Hrmcobol PowerCOBOL (ActiveX, v4 - v11) 2 15 de octubre de 2017 01:26

Respuesta
 
Herramientas

  #1
Antiguo 31 de mayo de 2020, 22:17
Breew
Patrocinador del Foro
Última Actividad 09.05.2022 07:47
Posts Posts: 125
Likes enviados Enviados: 104
Likes recibidos Recibidos: 8
Predeterminado sumar numeros de una lista
0 Inactivo Inactivo

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
Breew is offline   Responder Con Cita
  #2
Antiguo 1 de junio de 2020, 12:06
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179

Citación del post de Breew Ver Mensaje
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
Analise este código:
https://craftofcoding.wordpress.com/...-and-an-array/

Usar índices poderá ajudar:

Código COBOL:
  1. 01 myvar occurs 30 times INDEXED by myindex.
  2.     05 munumer  pic 999.
Joseg is offline   Responder Con Cita
  #3
Antiguo 1 de junio de 2020, 15:28
JCantero
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros 
Última Actividad 02.09.2026 00:15
Posts Posts: 442
Likes enviados Enviados: 167
Likes recibidos Recibidos: 269

Citación del post de Breew Ver Mensaje
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
Bonito problema a resolver en cobol con un occurs (array o tabla en otros lenguajes). ( esto podría ser un buen algoritmo para seleccionar personas con conocimientos)

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.
JCantero is offline   Responder Con Cita
  #4
Antiguo 1 de junio de 2020, 17:58
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

@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.-
Josber is offline   Responder Con Cita
  #5
Antiguo 2 de junio de 2020, 01:01
JCantero
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros 
Última Actividad 02.09.2026 00:15
Posts Posts: 442
Likes enviados Enviados: 167
Likes recibidos Recibidos: 269

Citación del post de Josber Ver Mensaje
@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.-

Creo que no es tanto.

Son (2^30)-1 == 1.073.741.823

Bonito reto
JCantero is offline   Responder Con Cita
  #6
Antiguo 2 de junio de 2020, 09:15
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

Citación del post de JCantero Ver Mensaje
Creo que no es tanto.
Serían combinaciones, (30!), no permutaciones, ¿no?, perdón si estoy equivocado, hace tantos años de las matemáticas ... a ver si alguiien más puesto que yo, nos lo aclara
Josber is offline   Responder Con Cita
  #7
Antiguo 2 de junio de 2020, 10:57
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179

Citación del post de Josber Ver Mensaje
Serían combinaciones, (30!), no permutaciones, ¿no?, perdón si estoy equivocado, hace tantos años de las matemáticas ... a ver si alguiien más puesto que yo, nos lo aclara

Em anexo projecto em Powercobol para calculo de um factorial e uma solução para o problema:
Código COBOL:
  1. * IDENTIFICATION DIVISION.
  2. * PROGRAM-ID. ACCSUM.
  3.  ENVIRONMENT     DIVISION.
  4.  DATA            DIVISION.
  5.  WORKING-STORAGE SECTION.
  6.  01  ACCOUNTS.
  7.      05  ACC-X       PIC S9(4)v99 COMP-3
  8.                     OCCURS 12 TIMES.
  9.  01  B               PIC 9(06) comp.
  10.  01  bx              PIC 9(06) comp.
  11.  01  pos             pic 9(06) comp.
  12.  01  sum1            pic s9(8)v99 comp-3.
  13.  01  sum2            pic s9(8)v99 comp-3.
  14.  01  r               pic 9(06) comp.
  15.  01  res             pic 9(06) comp.
  16.  01  comb            pic x(15) value space.
  17.  PROCEDURE       DIVISION.
  18.  0000-MAIN SECTION.
  19.      PERFORM 0100-init
  20.      perform 0200-process
  21.      EXIT PROGRAM.
  22.      
  23.  0100-init section.
  24.      move  134  to ACC-X(1)
  25.      move  400  to ACC-X(2)
  26.      move  322  to ACC-X(3)
  27.      move  100  to ACC-X(4)
  28.      move  300  to ACC-X(5)
  29.      move  86   to ACC-X(6)
  30.      move  600  to ACC-X(7)
  31.      move  700  to ACC-X(8)
  32.      move  800  To ACC-X(9)
  33.      move  200  to ACC-X(10)
  34.      move  123  to ACC-X(11)
  35.      move  203  to ACC-X(12).
  36. *>   exit.      *> GnuCobol
  37.  0200-process section.
  38.  
  39.      perform varying b from 0 by 1
  40.        until b > 4095   *> 2^12  --> se for 30 numeros tem k ser 2^30 = 1.073.741.824
  41.         compute bx = b
  42.         compute pos = 0
  43.         move zero to sum1 sum2
  44.         perform until bx = zero
  45.              divide bx by 2 giving res remainder r
  46.  
  47.             if ( r NOT = zero )
  48.               compute sum1 = sum1 + acc-x ( pos + 1 )
  49.               move '1' to comb(pos + 1 : 1)
  50.             else
  51.               compute sum2 = sum2 + acc-x ( pos + 1 )
  52.               move '0' to comb(pos + 1 : 1)
  53.             end-if
  54.  
  55.             compute bx = bx / 2
  56.             add 1 to pos
  57.  
  58.         end-perform
  59.  
  60.         if (sum1 = 986 ) then
  61.           display "-->Combinação: " comb " -->Soma=" sum2
  62.         end-if
  63.      end-perform.
  64. *>   exit.      *> GnuCobol
Archivos Adjuntos
Tipo de Archivo: zip Untitled.zip (5,0 KB)Descargas: 145
Joseg is offline   Responder Con Cita
  #8
Antiguo 2 de junio de 2020, 20:18
JCantero
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros 
Última Actividad 02.09.2026 00:15
Posts Posts: 442
Likes enviados Enviados: 167
Likes recibidos Recibidos: 269

@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 ¡¡¡



---------- 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.
JCantero is offline   Responder Con Cita
  #9
Antiguo 2 de junio de 2020, 22:59
Breew
Patrocinador del Foro
Última Actividad 09.05.2022 07:47
Posts Posts: 125
Likes enviados Enviados: 104
Likes recibidos Recibidos: 8

Brutal !!!!!!!!!

Menudos fieras

Gracias
Breew is offline   Responder Con Cita
  #10
Antiguo 3 de junio de 2020, 09:52
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

@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.



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
Respuesta



Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:49.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.