gpt4 book ai didi

c - uva 10110轻巧,更多轻巧在线法官给出错误答案

转载 作者:行者123 更新时间:2023-11-30 17:12:26 25 4
gpt4 key购买 nike

我认为这个问题可以通过平方根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

最佳答案

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

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


将n转换为双精度值(隐式)
将double值的sqrt计算为double
将结果转换为long int(为什么?)
将long int转换回long double(再次为什么?)


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


将n转换为双精度(隐式)
将double值的sqrt计算为double
将结果转换为整数


然后您测试:


in值转换为长整数(因为另一部分是)
比较两个double值


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

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


计算n的(双精度)平方根,将其转换为double型
将其舍入为整数(舍入而不是截断以避免愚蠢的精度问题)
比较此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;
}

关于c - uva 10110轻巧,更多轻巧在线法官给出错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31536294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com