uva 10110轻,更轻在线评委给出了错误的答案

时间:2015-07-21 10:17:12

标签: c acm

我认为这个问题可以通过一个平方根int数来解决....但是 为什么这段代码显示错误答案........?

#include<stdio.h>
#include<math.h>
int main(){
    long int  n;
    while(scanf("%ld",&n)==1&& n!=0)
    {
        long double dbl=(long)sqrt(n);
        int in=sqrt(n);
        if(dbl==in)
            printf("yes\n\n");
        else
            printf("no\n\n");
    }
    return 0;
}

link of problem

1 个答案:

答案 0 :(得分:0)

此代码错误,因为在math.h中,sqrt定义为double sqrt(double v);,因为浮点计算不一定准确。

这一行long double dbl=(long)sqrt(n);做了很多事情:

  • 将n转换为double值(隐含地)
  • 将double值的sqrt计算为double
  • 将结果转换为long int(为什么?)
  • 将long int转换为long double(同样为什么?)

第二个int in=sqrt(n);几乎相同(对于开头和小值):

  • 将n转换为double(隐含地)
  • 将double值的sqrt计算为double
  • 将结果转换为int

然后你测试:

  • in值转换为long double(因为其他部分是)
  • 比较2个双倍值

因此,在这两个部分中,您执行的操作完全相同,因此结果可能不是您想要的。

正如其他人所说,你应该:

  • 计算转换为双
  • 的n的(双)平方根
  • 将它四舍五入为一个int(圆形而不是截断以避免愚蠢的准确性问题)
  • 将此int的平方与初始n:
  • 进行比较

代码:

#include<stdio.h>
#include<math.h>
int main(){
    long int  n;
    while(scanf("%ld",&n)==1&& n!=0)
    {
        double dbl=sqrt((double) n);
        int in=(int) (dbl + 0.5);
        if(in * in == n)
            printf("yes\n\n");
        else
            printf("no\n\n");
    }
    return 0;
}