Algorithm 有人知道如何用COBOL编写这个算法吗:sum数组值的和等于X

Algorithm 有人知道如何用COBOL编写这个算法吗:sum数组值的和等于X,algorithm,cobol,Algorithm,Cobol,我有12个会计金额与本订单中提交的两个不同发票相关:-18.91、-8.48、-3654.47、-3379.07、-648.91、-2025.30、-1121.27、-1132.26、-22.68、-324.45、-861.50和-24.31;其中,这些会计金额的组合等于发票金额-8574.87;剩余金额应等于其他发票金额-4646.74。是否有一个可以用COBOL编写的数学公式来确定这个结果 01科目表值空间。 05科目录入发生50次 10账户金额PIC S9(12)V99 01发票表值空间。

我有12个会计金额与本订单中提交的两个不同发票相关:-18.91、-8.48、-3654.47、-3379.07、-648.91、-2025.30、-1121.27、-1132.26、-22.68、-324.45、-861.50和-24.31;其中,这些会计金额的组合等于发票金额-8574.87;剩余金额应等于其他发票金额-4646.74。是否有一个可以用COBOL编写的数学公式来确定这个结果

01科目表值空间。 05科目录入发生50次 10账户金额PIC S9(12)V99

01发票表值空间。 05存货录入发生50次
10库存金额PIC S9(12)V99有2^12种不同的账户组合。蛮力法 所有的组合都可以使用位掩码实现。(COBOL实现 不是那么简单),一个近似的伪代码 以获得如下概述

for b=0 to 2^12 - 1 do #each combination

  sum1 = 0
  sum2=  0
  for i=0 to 11 do   # which elements are included

     if (b && (1<<i) != 0)
        sum1 = sum1+ arr[i+1]
     else
        sum2 = sum2+ arr[i+1] 
    end
  end
  if (sum1= -8574.87 and sum2= -4646.74)
       print "got it"
  end
end
对于b=0到2^12-1 do#每个组合 sum1=0 sum2=0 对于i=0到11 do#包括哪些元素
if(b&&(1)代码很简单。你的算法在哪里?拿着铅笔和旧清单的背面坐下来,研究如何“手工”完成它。然后考虑如何使用COBOL代码实现。假设您正在学习一门课程,因此对于实现,您应该使用到目前为止所学的技术。但是,首先,确定如何实现。代码稍后会出现。我会选择-4646.74的数量,可能性会更小,因此运行更快。可以方便地对数据进行排序,这只是一个有限制的排列。是的,我已经能够在纸上解决这个问题。我需要一个COBOL例程,我的程序可以用于经常出现的这种情况。这只是我遇到的不同顺序的货币金额的一个例子。-18.91-3654.47-648.91-324.45=-4646.74。做得好。所以,你需要更新你的问你在伪代码中得到了什么,并说明你是如何尝试在COBOL中实现它的,以及你在哪里遇到了困难。这是我的问题。我正在寻找一个公式或算法及其语法,用COBOL编码,可以计算我之前提供的这个场景。是否存在可以用COBOL编写的公式rse。如果您使用问题下的编辑链接并将其添加到那里,您提出的代码可以用COBOL编写。如前所述,您应该至少给出一些如何处理代码的起点。如果您想在自己的时间内使用COBOL,请查看SourceForge上的GnuCOBOL。您可以更灵活地使用它r own.GnuCOBOL以前是OpenCOBOL,这很可能就是你在网上使用的。这是个好主意。我想你知道它是如何工作的。如果搜索的两个数量为零,加上所有12个数量的总和,那么你的搜索值为零,它就会失败。这不是一个大问题,好像搜索的一个数量为零,你可以很容易地缩短整个过程。如果三个a如果需要安装,或者数量为n,则仍然可以使其工作(base-3或base-n)。它依赖于当前所有单个值的组成,但即使是这样也可以处理。它将为值的组合找到多个解决方案。您的COBOL有一些方面。我假设您对COBOL相当陌生,但熟悉其他语言?您将bx除以2两次。使用了一个解决方案-E是编码的,不需要存储它们,但是使用当前的b值并对其进行反编码。剩下的两个计算最好是简单的加法。为了避免我提到的遗漏,请从1开始外部循环(并将一个添加到终端值)。也可以通过使用不同的方法进行内循环来避免,例如12次。外循环可以是4096次,并由您自己控制b。如果为每个“命中”寻找两个数量,而不是依赖于所有组成的值第一次,再做一次,但是从表中删除命中的成分。我不确定你是否知道
exit
没有任何作用。它足够快,但是更改会让读者更清楚(重要)更快。更灵活。请注意,如果您碰巧使用Enterprise COBOL V5,编译器将为您的除以2生成一个移位。不,我对COBOL并不陌生,但不熟悉使用引导我来到这里的语言来处理复杂的数学方程。我有两个表:一个用于会计金额,另一个用于发票金额nts。所有会计金额的总和将等于所有发票金额的总和;没有多余的钱。通常,会计金额按发票金额的顺序列出。知道发票金额,我可以通读订阅的会计表,直到会计金额的总和等于特定的投资油量。没问题。但是。。。。
IDENTIFICATION DIVISION.
PROGRAM-ID. ACCSUM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  ACCOUNTS.
    05  ACC-X       PIC S9(4)v99 COMP-3 
                    OCCURS 12 TIMES.
01  B               PIC 9(06) comp.
01  bx              PIC 9(06) comp.
01  pos             pic 9(06) comp.
01  sum1            pic s9(8)v99 comp-3.
01  sum2            pic s9(8)v99 comp-3.
01  r               pic 9(06) comp.
01  res             pic 9(06) comp. 
01  comb            pic x(15) value space.

PROCEDURE DIVISION.
0000-MAIN SECTION.
    PERFORM 0100-init
    perform 0200-process
    STOP RUN.
0100-init section.
    move  -18.91  to ACC-X(1)
    move  -8.48   to ACC-X(2)
    move  -3654.47 to ACC-X(3)
    move   -3379.07 to ACC-X(4)
    move   -648.91 to ACC-X(5)
    move  -2025.30 to ACC-X(6)
    move  -1121.27 to ACC-X(7)
    move  -1132.26 to ACC-X(8)
    move  -22.68 to ACC-X(9)
    move  -324.45 to ACC-X(10)
    move  -861.50 to ACC-X(11)
    move  -24.31 to ACC-X(12)
    exit.
0200-process section.

    perform varying b from 0 by 1
      until b>4095
       compute bx=b
       compute pos=0
       move zero to sum1 sum2
       perform until bx= zero
            divide bx by 2 giving res remainder r

            if ( r <> zero )
              compute sum1 = sum1+ acc-x ( pos + 1 )
              move '1' to comb(pos + 1 : 1)
            else
              compute sum2 = sum2+ acc-x ( pos + 1 )
              move '0' to comb(pos + 1 : 1)
            end-if

            compute bx = bx / 2
            add 1 to pos

       end-perform

       if (sum1 = -8574.87 ) then
         display "combination :" comb "-Sum2=" sum2
       end-if
    end-perform
    exit.