2

我正在尝试编写将给定数字拆分为其他 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)

非常感谢您的帮助。

4

2 回答 2

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=>第二个参数,...)
  • 查看有关 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. (100s, 150s, 170s) 只有 20 个可能的子集 - 2*2*5 个选项

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

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

面额的周期函数

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

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


这是我基于查找公式的解决方案: 匹配+索引公式

以下是我用来以csv 格式生成数据点、图片中的公式60 行表本身的python 脚本(按函数需要排序)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
于 2012-10-13T23:48:17.570 回答
0

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

在 C1:F1 范围内插入包含 4 个数字的标题行,例如 100、150、170 和 200

现在在 F2 中使用这个公式:

=INT(B2/F$1)

并在 C2 中复制到 E2

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

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

那应该从你的表中给出结果

于 2012-09-17T17:57:44.840 回答