从2到100有99个数字,抽取了两个数字,把这两个数字的和告诉了甲,把他们的乘积告
诉了乙。以下是这两人的一段对话:
甲:我不知道是哪两个数字,但我肯定你也不知道。
乙听了后略一思考,说:我原来也不知道是哪两个数字,但现在我知道了。
甲听后,先一顿,继而做恍然状,说:哦,我也知道了。
请问:所抽取的是哪两个数字?
///
/// Guess2 的摘要说明。
///
/// 用J表示甲,Y表示乙。
/// 先把 JUnknowAndJKnowYUnknow(甲知道而且甲知道乙不知道) 的所有情况放在 arraylist中
///
///
public class Guess2
{
public Guess2()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.InitArrayList();
this.Output();
}
public static int number = 100;
private ArrayList arrayJUnknowAndJKnowYUnknow;
///
/// 获得所有满足JUnknowAndJKnowYUnknow的数
/// 歌德巴赫猜想(大偶数等于二质数之和)虽然没完全证明,
/// 几十个亿早有人穷举过,如果可能是大偶数,甲不能断定乙肯定不知道。
///
private void InitArrayList()
{
this.arrayJUnknowAndJKnowYUnknow = new ArrayList();
for (int i = 7; i < 2 * number - 1; i=i+2)
{
if (this.JUnknowAndJKnowYUnknow(i))
this.arrayJUnknowAndJKnowYUnknow.Add(i);
}
}
public void Print( int x, int y)
{
Console.WriteLine ("x = " + x + " y = " + y);
}
///
/// 甲不知道数字是什么
/// 两者的和大于等于7,小于等于197
///
public bool JUnknow(int sum)
{
if (sum <= number*2 - 1 && sum >= 7)
return true;
return false;
}
///
/// 乙不知道数字是什么。
/// 有3个以上约数(除1和本身外)
/// 从2 到该数的平均数之间有两个以上的约数
///
///
public bool YUnknow(int s)
{
int count = 0;
for (int i = 2; i <= number && i <= Math.Sqrt(s); i++)
{
if (s%i == 0 && s/i <= number) //整除
{
count++;
}
if (count > 1) //表示有两个合数以上
return true;
}
return false;
}
///
/// 甲知道乙不知道,对sum值拆分.列出所有可能。
///
///
///
public bool JKnowYUnknow (int sum)
{
for (int i = 2; i < sum/2; i++)
{
if (sum - i > 100)
continue;
int s = i * (sum - i);
if (!YUnknow(s))
return false;
}
return true;
}
///
/// 甲不知道,且甲知道乙不知道。
///
///
///
public bool JUnknowAndJKnowYUnknow(int sum)
{
if (JUnknow (sum) && JKnowYUnknow (sum))
{
return true;
}
return false;
}
///
/// 然后乙知道了
///
///
///
public bool ThenYKnow (int s)
{
int count = 0;
int x, y;
//枚举,把积拆分
for (int i = 2; i < number && i <= Math.Sqrt(s) ; i++)
{
if (s%i == 0)
{
y = i;
x = s/i;
if (this.arrayJUnknowAndJKnowYUnknow.Contains(x + y))
{
count ++;
}
}
}
if (count == 1)
return true;
else
return false;
}
///
/// 最后甲知道了
///
///
///
public bool JKnowLast(int sum)
{
if (!this.arrayJUnknowAndJKnowYUnknow.Contains(sum))
{
return false;
}
int count = 0;
for (int i = 2; i < sum/2; i++)
{
int s = i * (sum - i);
if (ThenYKnow(s))
count++;
}
if (count == 1)
return true;
return false;
}
///
/// 打印出结果
///
public void Output()
{
Console.WriteLine("---------Guess2---------");
// foreach (int i in this.arrayJUnknowAndJKnowYUnknow)
// {
// Console.WriteLine(i);
// }
for (int x = 2; x <= number; x++)
{
for (int y = 2; y < x; y++)
{
if (this.arrayJUnknowAndJKnowYUnknow.Contains(x+y))
{
if (this.ThenYKnow(x*y))
if (this.JKnowLast(x + y))
{
this.Print(x, y);
}
}
}
}
Console.WriteLine("---------EndofGuess2---------");
}
public static void Main()
{
new Guess2();
}
}