A、B、C、D、Eの5人の学生がコンピューターコンテストに参加する可能性があり、条件によってどの人がコンテストに参加したかを判断します.


A、B、C、D、Eの5人の学生がコンピューターコンテストに参加する可能性があり、以下の条件に基づいてどの人がコンテストに参加したかを判断します.
(1)Aが参加する場合、Bも参加する.
(2)BとCは一人しか参加していない.
(3)cもdも参加するか、参加しないか.
(4)dとeは少なくとも1人が参加する.
(5)eが参加すれば,aもdも参加する.

class Program
{
static void Main(string[] args)
{
Dowork();
}
public static void Dowork()
{
for (int i = 0; i < 32; i++)
{
if (Logic(i))
{
Console.Write("A:{0},B:{1},C:{2},D:{3},E:{4}", ((i & 16) >> 4) == 1 ? true : false, ((i & 8) >> 3) == 1 ? true : false, ((i & 4) >> 2) == 1 ? true : false, ((i & 2) >> 1) == 1 ? true : false, ((i & 1)) == 1 ? true : false);
Console.ReadKey();
}
}
}

public static bool Logic(int exp)
{
bool a = Convert.ToBoolean((exp & 16) >> 4);
bool b = Convert.ToBoolean((exp & 8) >> 3);
bool c = Convert.ToBoolean((exp & 4) >> 2);
bool d = Convert.ToBoolean((exp & 2) >> 1);
bool e = Convert.ToBoolean(exp & 1);
if (a == b && b != c && c == d && !(d == false && e == false))
{
if (e == true)
{
if (a == true && d == true)
{
return true;
}
else
return false;
}
else
return true;
}
return false;
}

}

難点は
bool a = Convert.ToBoolean((exp & 16) >> 4);
bool b = Convert.ToBoolean((exp & 8) >> 3);
bool c = Convert.ToBoolean((exp & 4) >> 2);
bool d = Convert.ToBoolean((exp & 2) >> 1);
bool e = Convert.ToBoolean(exp & 1);
簡単な解釈:a,b,c,d,eはtrueに参加し、逆にfalseは0 1で表される.だから全部で32種類あります:a b c d e
0 0 0 0 0
0 0 0 0 1
0 0 0 1 0
.
.
.
1 1 1 1 1
このような32の場合.
aのバイナリ値を得る:(exp&16)>>4);これはまだどのように解釈するか分からないで、自分で先に考えて、上の表を連合して考えます!!考えにくい!