NSWOJ 2411 - 鬼谷子问徒

题目描述
本题为广为流传的一经典逻辑推理题目,原题如下:
孙膑,庞涓都是鬼谷子的徒弟。一天鬼谷子出了这道题目:
他从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;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/basketball616/article/details/85197391