我正在尝试编写将给定数字拆分为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)
非常感谢您的帮助。
答案 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;第二个参数,...),
代替;
让我们首先假设您希望优先使用 200s超过170s超过150s超过100s - 即300=200+100
而不是300=2*150
并遵循逻辑结论:
结果集只能包含最多1个100
,最多1个150
,最多4个170s
和无限数量的200s
(我从9 170s
开始,因为1700 = 8x200 + 100,但实际上最多有4个 )
只有20个可能的子集(100s,150s,170s) - 2 * 2 * 5个选项
930是结果集中没有任何200s
的最大输入数
基于对数据点的观察,该子集周期性地重复
number = 740*k + 10*l, k>1, l>0
- 我不是从数据上反复猜测周期函数的专家,但这是我正在进行的工作(图表数据点来自这个答案底部的表格) )
功能可能更复杂,如果我设法让它们正确,我会更新答案
无论如何,对于小于740的数字,需要更多调整公式或查找表(例如,无法获得730,因此结果应与740相同)
以下是基于查找公式的解决方案:
以下是用于生成数据点的 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列下所有列
那应该从你的表中得到结果