题目描述
本题为广为流传的一经典逻辑推理题目,原题如下:
孙膑,庞涓都是鬼谷子的徒弟。一天鬼谷子出了这道题目:
他从2到99中选出两个不同的整数,把积告诉孙,把和告诉庞;
庞说:我虽然不能确定这两个数是什么,但是我肯定你也不知道这两个数是什么。
孙说:我本来的确不知道,但是听你这么一说,我现在能够确定这两个数字了。
庞说:既然你这么说,我现在也知道这两个数字是什么了。
请问这两个数字是什么?为什么?
当然我的问题肯定不会这么难啦,我们知道他俩分别得到的数字,那么你能算出来他俩分别得到了什么数字吗?
输入
两个数字的和为a积为b(0<=a,b<=1000)
多组输入输出!!!
输出
这两个数字x y
如果没答案就输出0 0,而且如果有多个解可以得到我们只要第一个解就可以
如5 6输出的答案是
2 3
而不是
2 3
3 2
样例输入
4 4
样例输出
2 2
题解:核心思想在于求解一元二次方程 x^2-ax+b=c Δ=sqrt(aa-4b)
只要Δ<0刷掉,输出0 0.
只要Δ为小数,刷掉,输出0 0.(因为题目指出两个数都为整数)
输出是注意先输出小的后输出大的
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
double a,b;//由于要判断Δ是否为小数,所以我定义为了小数类型
while(cin>>a>>b)
{
if(a*a-4*b<0)//如果Δ<0刷掉,输出0 0.
{
cout<<"0 0"<<endl;
continue;
}
else if(a*a-4*b==0)//如果Δ=0只有一解输出两次即可
{
cout<<fixed<<setprecision(0)<<a/2<<' ';//注意输出是只输出整数部分
cout<<fixed<<setprecision(0)<<a/2<<endl;
}
else
{
int x=sqrt(a*a-4*b);//如果Δ为小数,刷掉,输出0 0.(因为题目指出两个数都为整数)
if(x!=sqrt(a*a-4*b))
{
cout<<"0 0"<<endl;
continue;
}
else
{
cout<<fixed<<setprecision(0)<<(a-sqrt(a*a-4*b))/2<<' ';
cout<<fixed<<setprecision(0)<<(a+sqrt(a*a-4*b))/2<<endl;
}
}
}
}