排列(permutition)

来源:互联网 发布:无锡房价 知乎 编辑:程序博客网 时间:2024/05/29 08:35

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

本题无法直接简单粗暴地用if(1<=a<=9&&1<=b<=9&&……){……}解决。
这里,如果if语句写成if(1<=a,b,c,d,e,f,g,h,i<=9) 更是错的,这句话并不能表达a~i都在1~9的范围内;因为逗号的运算符最低级,算数比较运算符运算级比逗号高,所以1<=a,b,c,d,e,f,g,h,i<=9相当于(1<=a),b,c,d,e,f,g,h,(i<=9),即中间的b,c,d,e,f,g,h是无意义的。

错误代码:目前不知道为什么这个代码不行

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int main(){    int a,b,c,d,e,f,g,h,i;     int x=a*100+b*10+c,y=d*100+e*10+f,z=g*100+h*10+i;    y=x*2;z=x*3;    if(1<=a<=9&&1<=b<=9&&1<=c<=9&&1<=d<=9&&1<=e<=9&&1<=f<=9&&1<=g<=9&&1<=h<=9&&1<=i<=9)    {        if((a!=b)&&(a!=c)&&(a!=d)&&(a!=e)&&(a!=f)&&(a!=g)&&(a!=h)&&(a!=i)&&......)        {            printf("%d%d%d%d%d%d%d%d%d\n",a,b,c,d,e,f,g,h,i);        }    }    return 0;}

正确代码:利用数组,a[1]~a[9]赋值为0,令a[出现的数字] = 1,若a[1] + a[2] + …… +a[9] == 9,则全部数字都出现。

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<algorithm>using namespace std;int main()  {      int x, y, z, a[10] = {0};      for(x = 100; x < 333; x++)      {          y = 2*x;          z = 3*x;          //令a[出现的数字] = 1          a[x/100] = a[x/10%10] = a[x%10] = 1;          a[y/100] = a[y/10%10] = a[y%10] = 1;          a[z/100] = a[z/10%10] = a[z%10] = 1;          int i, s = 0;          for(i = 1; i < 10; i++)              s += a[i];          if(s == 9)              printf("%d %d %d\n", x, y, z);          for(i = 1; i < 10; i++)  //重新赋值为0              a[i] = 0;      }      return 0;  } 
原创粉丝点击