【算法竞赛 入门经典】 习题2-6 排列

一、题目

用 1,2,3…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。

二、解题思路

可以想到abc的范围应该是大于123小于333。用数组num[10]保存1-9这九个数字的使用情况,num[i]=0,表示没有使用,num[i]=1,表示使用了。
直接暴力求解搜索def=2abc,ghi=3abc,并改变相应位的数字对应的num数组的值,若最后num数组的num[1]-num[9]均为1,即1-9每个数字都出现过,则输出对应的abc,def,ghi;否则进行下一次循环。

三、代码

#include<stdio.h>
int main(){
 int abc,def,ghi,num[10];//num数组用于记录相关数字是否出现过 
 for(abc=123;abc<333;abc++){ //根据要求缩小abc的取值范围 
  for(int i=0;i<10;i++){
   num[i]=0; //每次初始化记录数组为全0 
  }
  num[abc/100]=1;//记录abc百位上数字相关的数组值为1 
  num[abc/10%10]=1;//记录abc十位上数字相关的数组值为1
  num[abc%10]=1;//记录abc个位上数字相关的数组值为1
  def=abc*2; //求def,并同理将出现的数字用num数组做记录 
  num[def/100]=1;
  num[def/10%10]=1;
  num[def%10]=1;
  ghi=abc*3;
  num[ghi/100]=1;
  num[ghi/10%10]=1;
  num[ghi%10]=1;
  int i;
  for(i=1;i<10;i++){
   if(num[i]!=1){
    break;
   }
  }
  if(i==10){
   printf("abc: %d def: %d ghi: %d\n",abc,def,ghi);
  }
 }
 return 0;
}

在这里插入图片描述

发布了91 篇原创文章 · 获赞 28 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/gyx1549624673/article/details/102999494