HAUTOJ1148: 组合三位数之一

题目描述:

        把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。

输入:

输出:

按从小到大的顺序输出这三个三位数,由空格隔开。输出占一行。

 问题分析:

         乍一看,这道题无从下手,其实我们只需分开确定每一个数的每一位即可。因为我们已经知道这是三个三位数,因此我们只需要确保每个数的每一位数都不重复即可,这样我们遍历每一个由1-9组成的三位数即可。首先我们先确定第一个数a1的第一位数,从1开始,然后确保第二位数与第一位数不相等仍然从1开始,在第一位为1时第二位不能为1跳过,依次可得第二个数a2第三个数a3。然后判定这三个同时为完全平方数便输出这三个数a1a2a3,同时程序结束。这样即得到了结果。

       (解答疑惑:(1):为什么不比较a1,a2与a3大小而直接按a1,a2,a3的顺序输出?

因为数字是从1开始遍历故得到的a1与a2与a3是从小到大的顺序的,如果不在第一次输出后结束程序程序还会输出其它顺序的数的。因此我们在第一次输出就能得到结果了。

(2)怎么判定一个数是不是完全平方数呢?

只需要其开平方为整数即可,代码实现需满足条件sqrt(x)==(int)sqrt(x)

缺点:这样写出的代码用了九重循环而且多次使用了if语句看起来不简洁。

代码实现:

#include<stdio.h>
#include<math.h>
int main(){
	int a1,a2,a3;
	char s[10];
	scanf("%s",s);
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            if(j!=i){
                for(int k=1;k<=9;k++){
                    if(k!=i&&k!=j){
                    	a1=i*100+j*10+k;
                        for(int l=1;l<=9;l++){
                            if(l!=i&&l!=j&&l!=k){
                                for(int m=1;m<=9;m++){
                                    if(m!=i&&m!=j&&m!=k&&m!=l){
                                        for(int n=1;n<=9;n++){
                                            if(n!=i&&n!=j&&n!=k&&n!=l&&n!=m){
                                            	a2=l*100+m*10+n;
                                                for(int o=1;o<=9;o++){
                                                    if(o!=i&&o!=j&&o!=k&&o!=l&&o!=m&&o!=n){
                                                        for(int p=1;p<=9;p++){
                                                            if(p!=i&&p!=j&&p!=k&&p!=l&&p!=m&&p!=n&&p!=o){
                                                                for(int q=1;q<=9;q++){
                                                                    if(q!=i&&q!=j&&q!=k&&q!=l&&q!=m&&q!=n&&q!=o&&q!=p){
                                                                    	a3=o*100+p*10+q;
                                                                    	if((sqrt(a1)==(int)sqrt(a1))&&(sqrt(a3)==(int)sqrt(a3))&&(sqrt(a2)==(int)sqrt(a2))){
                                                                    		printf("%d %d %d",a1,a2,a3);
                                                                    		return 0;
																		}
																	}
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

写出来后就是这样的屎山代码。

虽然看起来比较复杂,但在思维上比较好理解。

运行结果:

        

 较为简单的方法是先判断出由1~9组成的三位数中的完全平方数,将所有完全平方数保存起来,然后判断其中三个数的每一位数有无重复即可。代码不在此展示了,有需要的可以私聊我。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值