70 問のテストで考えられる結果を計算しようとしています。それらはすべてブールです。それを行う方法と、実行する必要がある計算の数。
5 に答える
70 個の true/false 値のすべての組み合わせを実行する必要がある場合、それは約 2^70 = 1.18e21 = 1.18 セクスティリオンの組み合わせです。クロック サイクルごとに 1 つ実行できる場合、3 GHz の 4 コア マシンですべての解を計算するには 3000 年かかります。各結果を厚さ 0.1 mm の紙に 1 ページあたり 50 行で印刷すると、紙の束は 1 兆マイルを超える高さになります (1 マイルの高さの紙の束には 1,600 万枚以上のシートがあるという事実を考えるかもしれません)。 、重さ 72 トン、製造には 1000 本以上の木が必要です)。
この問題を分析する方法を再考します。
それぞれの結果は true または false になる可能性があるため、合計で 2^70 の結果があります。(めちゃめちゃ多いです!)
すべての結果を列挙したい場合は、次のようにします。
IEnumerable<IEnumerable<bool>> EnumerateResults()
{
var curr = new List<bool>();
for (var idx = 0; idx < 3; idx++) curr.Add(false);
while (!curr.All(v => v))
{
var idx = 0;
// add one with carry
while (curr[idx]) // no index OOB, because of while condition
{
curr[idx] = false;
idx++;
}
curr[idx] = true;
yield return new List<bool>(curr); // clone
}
}
true だった bool の量を取得したい場合は、それらが配列に格納されていると仮定して、それらをループします。
int score = 0;
for(int c = 0; c < boolArray.Length; c++)
{
if(boolArray[c])
{
score++;
}
}
// (Now you have the score)
私は C# にあまり詳しくないので、この正確なコードが機能するかどうかはわかりませんが、ポイントを理解する必要があります。
テストで得られるすべての可能性が必要な場合は、2 ^ 70 (2 は bool が 2 つの値しか保持しないため、70 は 70 個の bool があるため) です。
おそらく、これをループまたは再帰的に実行したいと思うでしょう。
それが可能なテストの数であることを考えると、 2 70の計算を行う必要があります。
または、個々のパスを気にしない場合は、 70だけかもしれません。
答えは簡単です。N サイズの 2 進数を扱っています。たとえば、4 問のテストには 16 の可能性があります
0000 0001 0010 0011
0100 0101 0110 0111
1000 1001 1010 1011
1100 1101 1110 1111
N の場合、ちょうど 2^N です