Algorithm 有人知道如何用COBOL编写这个算法吗:sum数组值的和等于X
我有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次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发票表值空间。
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.