题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2092
题 意:给你两个数n,m问是否有x,y满足x+y==n&&x*y==m。
思 路:
1.直接在取值范围内暴力枚举即可。
代码如下:
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <cmath>
#include <algorithm>
int main()
{
int n, m;
while( scanf ( "%d %d", &n, &m ) != EOF )
{
if( n == 0 && m == 0 ) break;
int i, f = 0;
for( i = -10000; i <= 10000; i ++ )
{
if( i * ( n - i ) == m )
{
f=1;break;
}
}
if( f ) printf("Yes\n");
else printf("No\n");
}
return 0;
}
2 :将x+y=n与x*y=m化为一个公式,
x+m/x=n即x*x+n*x+m=0,判断这个式子是否有实数解且实数解为整数。
即要满足s = n*n-4*m>=0与(n±√s)/2为整数
即(n±√s)/2为整数要满足两个条件:
①(int)√num*(int)√num = num,则√num为整数
②若(n±√num)%2==0,则(n±√num)/2为整数
代码如下:
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <cmath>
#include <algorithm>
int main()
{
int n, m;
while( scanf ( "%d %d", &n, &m ) != EOF )
{
if( n == 0 && m == 0 ) break;
int s = n*n - 4*m;
if( s >= 0 && (int)sqrt(s*1.0)*(int)sqrt(s*1.0) == s && (int)(n + sqrt(s*1.0))%2==0 && (int)(n - sqrt(s*1.0)) %2==0 )
printf("Yes\n");
else printf("No\n");
}
return 0;
}