aabb问题又名7744问题,因为这个问题在规定范围内只有这一个解。(作者自己编的解释)
问题:输出所有形如aabb的4位数的完全平方数(即前两个数字相等,后两个数字相等)。
方法一:
#include
#include
int main()
{
for(int i=1;i<=9;i++)
{
for(int j=0;j<=9;j++)
{
int n=i*1100+j*11;
int m=floor(sqrt(n)+0.5);
if(m*m==n)
printf("%d\n",n);
}
}
return 0;
}
上面这个程序用到了两个库函数stdio.h和math.h。
其中floor(x)函数和sqrt(x)函数是存在于math.h库函数下的,分别用于求不超过x的最大整数和x的平方根。
floor(x+0.5)就是一个四舍五入的方法。读着可以自己尝试理解。
方法二:
#include
int main()
{
for(int n=1;;n++)
{
int x=n*n;
if(x<1000) continue;
if(x>9999) break;
int a=x/100;
int b=x%100;
if(a/10==a%10&&b/10==b%10)
printf("%d\n",x);
}
return 0;
}
上面这个程序只用到了stdio.h函数,方便初学者,尤其是还不太了解可函数的人学习使用,整个程序也比较方便理解。读不懂的同学可以继续往下看。
“/”符号在C环境中也是除的意思,但是请注意前面的被赋值的变量的类型,a是int型,也就是整形,那么x/100求得的结果只取小数点前面的部分,也就是说,我写的这个程序中a就是题目中的aa,同理b的含义也好理解。"%"符号在C环境中代表的意思是取模,通俗的讲就是取余,这一点需要不懂的同学特别记忆一下。
接下来,再说明一下continue和break两个标识符的含义和作用。按照翻译,就不难理解,继续和停止。但请注意:continue是跳回for循环的开始“继续”,break是直接调出整个循环结构“停止”。也就是说,不管是执行了continue语句还是break语句,它后面的for循环里面那一部分都是不再执行直接跳过的,这一点不要搞错了。
明白了这两点,这个程序应该就没什么大问题了,当然,在一些小地方会有很多种写法。比如,我们在给for初始化的时候,直接将n的值赋为32,那吗,后面的程序中就不需要if(x<1000) continue;这个语句了,可见,使用continue语句可以帮我们减少计算,顺便偷个懒!
3636





