#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
//所以以后注意在相同作用域的变量名不要重名!
Comments NOTHING