7744问题的两种解法

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语句可以帮我们减少计算,顺便偷个懒!

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值