杭电ACM-2092 (floor(x)取整函数)

题目:

杭电ACM-2092 (floor(x)取整函数)_第1张图片
2092题

代码:

#include
#include
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!!!。

反例:

杭电ACM-2092 (floor(x)取整函数)_第2张图片
转自红酥草木香(http://blog.csdn.net/syh173)

然后找到了一个函数(算法竞赛 入门经典(第二版)P21)floor函数
floor(x)函数功能就是对x取整,也就是只要整数部分不要小数部分
但还有个问题需要注意,就是在经过大量计算后,由于误差的影响,整数1变成了0.9999999999,floor的结果会是0而不是1。所以要进行四舍五入,即floor(x+0.5)
虽然似乎这道题加不加0.5都可以Ac但是还是注意下吧

你可能感兴趣的:(杭电ACM-2092 (floor(x)取整函数))