11.28 输出是否是完全平方数并且有两位数字相同的三位数必须将sqrt的返回值强制转换为整型数据

发布于 2024-11-28  66 次阅读


#include <stdio.h>
#include <math.h>

void pr(int n){
int count=0;
for(int i=101;i<=n;i++){
int count1=0,count2=0;
double m=sqrt(i);
if(m*m==i){
 count1=1;
}
int t=i;
int f[10]={0};
while(t!=0){
f[t%10]++;
t/=10;
}
for(int j=0;j<10;j++){
if(f[j]==2){
count2=1;
break;
}
}
if(count1==1&&count2==1){
count++;
}
}
printf("%d",count);
}

int main(){
int n;
scanf("%d",&n);
pr(n);
return 0;
}

输入222,返回的不是2而是20

写成int m=sqrt(i);便返回的是2

这是为什么?

浮点数在计算机中是以近似值存储的,可能会导致精度丢失

例如,sqrt(2) 的结果是一个无理数,计算机可能会存储一个非常接近但不完全等于 sqrt(2) 的值

这样,可能的舍入误差有时会导致判断错误,把是完全平方数判断为不是,或者把不是完全平方数判断为是

所以必须定义int类型的m来隐式转换,或者用强制转换运算符,来避免这种误差

反正,在实际应用中,用整数运算来判断完全平方数!

//一开始的时候还有第二个错误,我开始的时候在大for(这里已经用到了i)循环里面不是用int j而是用int i

//所以以后注意在相同作用域的变量名不要重名!

届ける言葉を今は育ててる
最后更新于 2024-11-29