输出所以形如aabb的四位完全平方数
#include <stdio.h>
#include<math.h>
int main()
{
int a,b,n;
double m;
for(a=1;a<=9;a++)
{
for(b=1;b<=9;b++)
{
n=a*1100+b*11;
m=sqrt(n);
if(floor(m+0.5)==m)printf("%d\n",n);
}
}
return 0;
}`
floor(x)返回x的整数部分,那么为什么不直接比较floor(m)和m呢?原因是:浮点数的运算(和函数)有可能存在误差——不是一定存在,但经常有。
假设在经过大量计算后,由于误差的影响,整数1变成了0.9999999999,floor的结果是0而不是1!为了减小误差的影响,我们一般改成四舍五入,即floor(x+0.5)。如果难于理解,可以想象在数轴上把一个单元区间往做移动0.5个单元的距离。floor(x)等于1的区间为[1,2),而floor(x+0.5)等于1的区间为[0.5,1.5).
另一个思路是枚举平方根。
#include <stdio.h>
int main()
{
int x,n,hi,lo;
for(x=32;;x++)
{
n=x*x;
if(n<1000)continue;
if(n>9999)break;
hi=n/100;
lo=n%100;
if(hi/10==hi%10&&lo/10==lo%10)printf("%d\n",n);
}
return 0;
}