题目:
代码:
#include<stdio.h>
#include<math.h>
int main()
{
double sum,a,b,i;
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
i=n*n-4*m;
a=(sqrt(i)+n)/2;
b=(n-sqrt(i))/2;
//printf("%lf %lf %lf\n",a,b,i);
if(a==floor(a+0.5)&&b==floor(b+0.5))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
注意:此题的难点就是判断a,b是否为整数
最开始想到的方法就是a==int(a)&&b==int(b)???
但是这样肯定是不行的 为什么不行呢???是因为没考虑负数(正数是完全可以的(结果))
强制转换(int)与floor的区别。
首先floor返回小于或等于它的最大整数。
而(int)在大多数情况返回整数部分。
所以他们的求值在负数的情况是不一样的,
如floor(-3.2)=-4,(int)-3.2=-3!!!。
反例:
然后找到了一个函数(算法竞赛 入门经典(第二版)P21)floor函数
floor(x)函数功能就是对x取整,也就是只要整数部分不要小数部分
但还有个问题需要注意,就是在经过大量计算后,由于误差的影响,整数1变成了0.9999999999,floor的结果会是0而不是1。所以要进行四舍五入,即floor(x+0.5)
虽然似乎这道题加不加0.5都可以Ac但是还是注意下吧