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. 结果集最多只能包含1 100最多1 150最多4 170s ,无限数量的200s我以9个170s开始,因为1700 = 8×200 + 100,实际上最多只有4个

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

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

  4. 基于对数据点的观察,子集定期重复
    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中的公式复制到所有列中

这应该给你的表结果