Excel将给定数字拆分为其他数字的总和

时间:2012-09-17 15:40:40

标签: excel excel-vba excel-formula vba

我正在尝试编写将给定数字拆分为4个其他数字之和的公式。

其他数字是100,150,170和200,所以公式是 x = a * 100 + b * 150 + c * 170 + d * 200 其中x是给定数字,a,b,c,d是整数。

我的电子表格设置为col B为x值,C,D,E,F分别为a,b,c,d(见下文)。

   B  |  C  |  D  |  E  |  F  |
  100    1     0     0     0
  150    0     1     0     0   
  200    0     0     0     1  
  250    1     1     0     0  
  370    0     0     1     1   
  400    0     0     0     2 

我需要C,D,E,F列的公式(公式中的a,b,c,d)

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

<强>更新

根据以下研究,对于大于730的输入数字和/或所有实际可分割的输入数字,请使用以下公式:

100s: =CHOOSE(MOD(ROUNDUP([@number]/10;0); 20)+1;
       0;1;1;0;1;1;0;1;0;0;1;0;0;1;0;0;1;0;1;1)
150s: =CHOOSE(MOD(ROUNDUP([@number]/10;0); 10)+1;
       0;0;1;1;0;1;1;0;0;1)
170s: =CHOOSE(MOD(ROUNDUP([@number]/10;0); 5)+1;
       0;3;1;4;2)
200s: =CEILING(([@number]-930)/200;1) + 
       CHOOSE(MOD(ROUNDUP([@number]/10;0); 20)+1;
       4;1;2;0;2;3;1;3;1;2;4;2;3;0;2;3;0;3;0;1)
  • MOD(x; 20)将返回数字0 - 19,CHOOSE(x;a;b;...)将根据第一个参数返回第n个参数(1 =&gt;第二个参数,...)
  • 请参阅more info about CHOOSE
  • 根据您的Windows语言和地区设置使用,代替;

让我们首先假设您希望优先使用 200s超过170s超过150s超过100s - 即300=200+100而不是300=2*150并遵循逻辑结论:

  1. 结果集只能包含最多1个100 最多1个150 最多4个170s 和无限数量的200s我从9 170s开始,因为1700 = 8x200 + 100,但实际上最多有4个

  2. 只有20个可能的子集(100s,150s,170s) - 2 * 2 * 5个选项

  3. 930是结果集中没有任何200s的最大输入数

  4. 基于对数据点的观察,该子集周期性地重复
    number = 740*k + 10*l, k>1, l>0 - 我不是从数据上反复猜测周期函数的专家,但这是我正在进行的工作(图表数据点来自这个答案底部的表格) )

  5. periodic functions for denominations

    • 功能可能更复杂,如果我设法让它们正确,我会更新答案

    • 无论如何,对于小于740的数字,需要更多调整公式或查找表(例如,无法获得730,因此结果应与740相同)


    以下是基于查找公式的解决方案: match+index formulas

    以下是用于生成数据点的 python脚本,图片中的公式和csv中的 60行表本身格式(根据match函数的需要排序)

    headers = ("100s", "150s", "170s", "200s")
    table = {}
    for c200 in range(30, -1, -1):
        for c170 in range(9, -1, -1):
            for c150 in range(1, -1, -1):
                for c100 in range(1, -1, -1):
                    nr = 200*c200 + 170*c170 + 150*c150 + 100*c100
                    if nr not in table and nr <= 6000:
                        table[nr] = (c100, c150, c170, c200)
    print("number\t" + "\t".join(headers))
    for r in sorted(table):
        c100, c150, c170, c200 = table[r]
        print("{:6}\t{:2}\t{:2}\t{:2}\t{:2}".format(r, c100, c150, c170, c200))
    __________
    
    =IF(E$1<740; 0; INT((E$1-740)/200))
    =E$1 - E$2*200
    =MATCH(E$3; table[number]; -1)
    =INDEX(table[number]; E$4)
    =INDEX(table[100s]; E$4)
    =INDEX(table[150s]; E$4)
    =INDEX(table[170s]; E$4)
    =INDEX(table[200s]; E$4) + E$2
    __________
    
    number,100s,150s,170s,200s
    940,0,0,2,3
    930,1,1,4,0
    920,0,1,1,3
    910,0,0,3,2
    900,1,0,0,4
    890,0,1,2,2
    880,0,0,4,1
    870,1,0,1,3
    860,0,1,3,1
    850,1,1,0,3
    840,1,0,2,2
    830,0,1,4,0
    820,1,1,1,2
    810,1,0,3,1
    800,0,0,0,4
    790,1,1,2,1
    780,1,0,4,0
    770,0,0,1,3
    760,1,1,3,0
    750,0,1,0,3
    740,0,0,2,2
    720,0,1,1,2
    710,0,0,3,1
    700,1,0,0,3
    690,0,1,2,1
    680,0,0,4,0
    670,1,0,1,2
    660,0,1,3,0
    650,1,1,0,2
    640,1,0,2,1
    620,1,1,1,1
    610,1,0,3,0
    600,0,0,0,3
    590,1,1,2,0
    570,0,0,1,2
    550,0,1,0,2
    540,0,0,2,1
    520,0,1,1,1
    510,0,0,3,0
    500,1,0,0,2
    490,0,1,2,0
    470,1,0,1,1
    450,1,1,0,1
    440,1,0,2,0
    420,1,1,1,0
    400,0,0,0,2
    370,0,0,1,1
    350,0,1,0,1
    340,0,0,2,0
    320,0,1,1,0
    300,1,0,0,1
    270,1,0,1,0
    250,1,1,0,0
    200,0,0,0,1
    170,0,0,1,0
    150,0,1,0,0
    100,1,0,0,0
    0,0,0,0,0
    

答案 1 :(得分:0)

假设您想要尽可能多的最高值(因此500将是2 * 200 + 100)尝试这种方法,假设要在B2中分割数字:

插入带有4个数字的标题行,例如在C1:F1

范围内的100,150,170和200

现在在F2中使用此公式:

=INT(B2/F$1)

并在C2中复制到E2

=INT(($B2-SUMPRODUCT(D$1:$G$1,D2:$G2))/C$1)

现在您可以复制C2中的公式:F2列下所有列

那应该从你的表中得到结果