鱼C论坛

 找回密码
 立即注册
查看: 2227|回复: 1

[已解决]打印符合要求的完全平方数

[复制链接]
发表于 2020-10-31 09:13:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
任务描述
输入一个整数n(n<=10000),打印n以内所有这样的完全平方数y:y=a2=b2x10+c2。例如,361=192=62x10+12,则361是这样的完全平方数。

相关知识
完全平方数
条件语句
循环控制语句

编程要求
根据提示,在右侧Begin-End区域编写一个完整满足任务要求的程序。
如果符合条件的完全平方数有2种以上的分解形式,取b较小的分解形式。

测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。

预期输入:

500

预期输出:
49=7*7=2*2*10+3*3
121=11*11=2*2*10+9*9
169=13*13=4*4*10+3*3
196=14*14=4*4*10+6*6
361=19*19=6*6*10+1*1
441=21*21=6*6*10+9*9
484=22*22=4*4*10+18*18

预期输入:

2500

预期输出:
49=7*7=2*2*10+3*3
121=11*11=2*2*10+9*9
169=13*13=4*4*10+3*3
196=14*14=4*4*10+6*6
361=19*19=6*6*10+1*1
441=21*21=6*6*10+9*9
484=22*22=4*4*10+18*18
529=23*23=6*6*10+13*13
676=26*26=8*8*10+6*6
784=28*28=8*8*10+12*12
1089=33*33=6*6*10+27*27
1225=35*35=10*10*10+15*15
1369=37*37=8*8*10+27*27
1444=38*38=12*12*10+2*2
1521=39*39=12*12*10+9*9
1681=41*41=4*4*10+39*39
1764=42*42=12*12*10+18*18
1936=44*44=8*8*10+36*36
2116=46*46=12*12*10+26*26
2209=47*47=6*6*10+43*43
2401=49*49=12*12*10+31*31

我的代码会输出多种分解形式。
请修改我的代码,使它符合如果符合条件的完全平方数有2种以上的分解形式,取b较小的分解形式。
(请不要提供新的代码,否则不予采纳,谢谢)
/********** Begin **********/
#include <stdio.h>
int main()
{
    int m,n,y,i,p,q;
    int count=0;
    scanf("%d",&n);
    for(m=1;m<=n;m++)
    {
        for(i=1;i<200;i++)
        {
            if(m==i*i)
            {
                for(p=1;p<200;p++)
                {
                    for(q=1;q<200;q++)
                    {
                        if(m==p*p*10+q*q) 
                        {
                            printf("%d=%d*%d=%d*%d*10+%d*%d\n",m,i,i,p,p,q,q);
                        }
                    }
                }
            }
            else continue;
        }
        
    }
    return 0;
}

/**********  End **********/
最佳答案
2020-10-31 16:37:36
本帖最后由 大裤衩子 于 2020-10-31 16:39 编辑

多余的变量我就删掉了,还有就是10000以内的话,只循环100次足已。
分解有重复的时候b肯定是从小变大的,所以只需要第一次全部满足条件后跳出循环就可以了。
虽说goto语句多次使用容易让代码混乱,但此处跳出多层循环还是很好用的。
/********** Begin **********/
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for(int m=1;m<=n;m++)
    {
        for(int i=1;i<=100;i++)
        {
            if(m==i*i)
            {
                for(int p=1;p<=100;p++)
                {
                    for(int q=1;q<=100;q++)
                    {
                        if(m==p*p*10+q*q)
                        {
                            printf("%d=%d*%d=%d*%d*10+%d*%d\n",m,i,i,p,p,q,q);
                            goto out;
                        }
                    }
                }
                out:   //  要保证m==i*i 成立,所以跳转到此处
                    continue;
            }
        }

    }
    return 0;
}

/**********  End **********/


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-31 16:37:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 大裤衩子 于 2020-10-31 16:39 编辑

多余的变量我就删掉了,还有就是10000以内的话,只循环100次足已。
分解有重复的时候b肯定是从小变大的,所以只需要第一次全部满足条件后跳出循环就可以了。
虽说goto语句多次使用容易让代码混乱,但此处跳出多层循环还是很好用的。
/********** Begin **********/
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for(int m=1;m<=n;m++)
    {
        for(int i=1;i<=100;i++)
        {
            if(m==i*i)
            {
                for(int p=1;p<=100;p++)
                {
                    for(int q=1;q<=100;q++)
                    {
                        if(m==p*p*10+q*q)
                        {
                            printf("%d=%d*%d=%d*%d*10+%d*%d\n",m,i,i,p,p,q,q);
                            goto out;
                        }
                    }
                }
                out:   //  要保证m==i*i 成立,所以跳转到此处
                    continue;
            }
        }

    }
    return 0;
}

/**********  End **********/


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 19:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表