Excel将给定的数字分成其他数字的总和
我试图写公式,将一个给定的数字分成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)
非常感谢您的帮助。
更新 :
基于以下研究,对于大于730的input数字和/或对于所有实际可分解的input数字,使用以下公式:
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语言和地区设置
我们首先假设你想要在170s内超过150s ,最好在100s内使用200s,即300=200+100
而不是300=2*150
并遵循以下逻辑结论:
-
结果集最多只能包含1
100
, 最多1150
, 最多4170s
,无限数量的200s
( 我以9个170s
开始,因为1700 = 8×200 + 100,实际上最多只有4个 ) -
(100s,150s,170s)只有20个可能的子集–2 * 2 * 5个选项
-
930是结果集中没有任何
200s
的最大input数字 -
基于对数据点的观察,子集定期重复
number = 740*k + 10*l, k>1, l>0
– 我不是一个从数据的周期函数反向猜测的专家,但这里是我的工作进展(图表数据点是从表这个答案的底部)
-
function可能更复杂,如果我设法让他们正确的,我会更新答案
-
无论如何,对于小于740的数字,需要更多的公式或查找表的调整(例如,没有办法得到730,所以结果应该是740)
这是我的解决scheme基于查找公式:
以下是我用来生成数据点的python脚本 ,图片中的公式和csv格式的60行表格本身(按照match
函数的需要进行sorting) :
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
假设你想要尽可能多的最高值(所以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中的公式复制到所有列中
这应该给你的表结果