2

特定の数値を他の 4 つの数値の合計に分割する数式を作成しようとしています。

他の数値は 100、150、170、および 200 であるため、式は x = a*100+b*150+c*170+d*200となります。x は指定された数値で、a、b、c、d は整数です。

私のスプレッドシートは、列 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=>2 番目の引数、...)
  • CHOOSEの詳細を見る
  • Windows の言語と地域の設定に基づいて,代わりに使用する;

200 を 170 よりも 150 よりも 100 よりも優先して使用したいという仮定から始めましょう。つまり300=200+100、代わりに300=2*150論理的な結論に従います。

  1. 結果セットには、最大 1100最大 1150最大 4170s、無制限の数しか含めることができません200s( 1700=8x200+100 のため、9 から始めまし170sたが、実際には最大 4 でした)

  2. (100s、150s、170s) の 20 の可能なサブセットのみがあります - 2*2*5 オプション

  3. 200s930 は、結果セットに含まれない最大の入力数です。

  4. データ ポイントの観察に基づいて、サブセットは定期的に繰り返さ
    number = 740*k + 10*l, k>1, l>0れます。答え)

宗派の周期関数

  • 関数はおそらくもっと複雑です。うまくいけば、答えを更新します

  • いずれにせよ、740 より小さい数値の場合は、数式またはルックアップ テーブルをさらに調整する必要があります(たとえば、730 を取得する方法がないため、結果は 740 の場合と同じになるはずです)。


ルックアップ式に基づく私のソリューションは次のとおりです。 マッチ+インデックス式

以下は、データポイント、画像からの数式、および60 行のテーブル自体を csv 形式で生成するために使用した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 の範囲に 100、150、170、200 などの 4 つの数字を含むヘッダー行を挿入します。

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 に答える