HDU2092 整数解【水题】【数学】

整数解


Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22482    Accepted Submission(s): 7816


Problem Description
有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程。
例如:
x + y = 9,x * y = 15 ? 找不到这样的整数x和y
1+4=5,1*4=4,所以,加起来等于5,乘起来等于4的二个整数为1和4
7+(-8)=-1,7*(-8)=-56,所以,加起来等于-1,乘起来等于-56的二个整数为7和-8
 


Input
输入数据为成对出现的整数n,m(-10000<n,m<10000),它们分别表示整数的和与积,如果两者都为0,则输入结束。
 


Output
只需要对于每个n和m,输出“Yes”或者“No”,明确有还是没有这种整数就行了。
 


Sample Input
9 15
5 4
1 -56
0 0
 


Sample Output
No
Yes
Yes
 


Author

qianneng


题目大意:给你整数x和y的和以及x和y的积,是否能找到满足这两个式子

的整数x和整数y。能找到输出Yes,否则输出No

思路:设x+y = n,x*y = m,已知n、m,将第二个式子代入第一个式子,

x+m/x = n,即x^2 +m = n*x,即x^2 - n*x + m = 0。转换为一个一元

二次方程,判断一个一元二次方程是否有整数解。需要先判断是否有实数解。

即b^2-4*a*c是否大于等于0。再判断(-b±√4*a*c)/(2*a)是否为整数。

题目里b^2-4*a*c就是 n*n-4*m。设num = n*n-4*m。则(-b±√4*a*c)/(2*a)

= (n±√num)/2。

需要判断num是否大于等于0,再判断(n±√num)/2是否为整数。

(n±√num)/2满足两个条件:

①(int)√num*(int)√num = num,则√num为整数

②若(n±√num)%2==0,则(n±√num)/2为整数


#include<stdio.h>
#include<string.h>
#include<math.h>

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m) && (m||n))
    {

        int num = n*n-4*m;
        if(num >= 0 && (int)sqrt(num*1.0)*(int)sqrt(num*1.0) == num && (int)(n + sqrt(num*1.0))%2==0 && (int)(n - sqrt(num*1.0)) %2==0)
            printf("Yes\n");
        else
            printf("No\n");
    }


    return 0;
}






你可能感兴趣的:(HDU2092 整数解【水题】【数学】)