题目描述:
把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组成的三位数中的完全平方数,将所有完全平方数保存起来,然后判断其中三个数的每一位数有无重复即可。代码不在此展示了,有需要的可以私聊我。