由1到9的9个数组成3个3位数,且三个数成1:2:3的比例,试求出所有的组合
2012-11-23 19:10
323 查看
一个同学在做ACM,给了我一道题,题目就如标题一样。最后写出如下
这个我觉的应该是有很多的算法的,我没还没看过多少算法的知识,现写成如上。
------------------------------------------20121127-------------------------------
这个不是我想出来的。确实这个简短多了,也高效多了,我进行了许多无用的思考。事实上,检验可以放到最后,一些判断也可以精简掉。哈哈,长见识了,每个人都有思维的误区,考虑的太草率了。
/*用1到9的数,组成3个3位数,且三个数比例为1:2:3,求出所有满足条件的数*/ #include<stdio.h> #include<stdbool.h> int noc_1 (int n); //返回n的百位的数字 int noc_2 (int n); //返回n的十位的数字 int noc_3 (int n); //返回n的个位的数字 bool check (int x,int y,int z); //检验x y x的每个位上的数字是否相同如果都不相同返回true,否则返回false int main(void) { int a,b,c; //a b c 为3个三位数的数 int i,j,k; //i j k 为a的百 十 个 位的数字 int n_1,n_2,n_3; //用n_1 n_2 n_3 来轮换a的三个位的数字 for (n_1=1;n_1<4;n_1++) { i=n_1; for (n_2=1;n_2<10;n_2++) { if (n_2==n_1) //如果有相同的数字 舍弃这个系列的组合 continue; j=n_2; for (n_3=1;n_3<10;n_3++) { if (n_2==n_3||n_1==n_3) //如果有相同的数字 舍弃这个系列的组合 continue; k=n_3; a=i*100+j*10+k; b=a*2; c=a*3; if(c>999) //如果为四位数 舍弃这个组合 continue; if(check (a,b,c)==true) printf("%5d%5d%5d\n",a,b,c); } } } return 0; } int noc_1 (int n) { return n/100; } int noc_2 (int n) { n=n/10; return n%10; } int noc_3 (int n) { return n%10; } bool check (int x,int y,int z) { int a[9]; a[0]=noc_1 (x); a[1]=noc_2 (x); a[2]=noc_3 (x); a[3]=noc_1 (y); a[4]=noc_2 (y); a[5]=noc_3 (y); a[6]=noc_1 (z); a[7]=noc_2 (z); a[8]=noc_3 (z); int i,j; for (i=0;i<9;i++) { if(a[i]==0) //b c 中可能有位上的数为0 若为0 则返回false return false; for(j=0;j<9;j++) { if(j==i) continue; if(a[i]==a[j]) return false; } } return true; }编译,运行后如下所示
hyp@debian:~$ gcc -Wall shu.c hyp@debian:~$ ./a.out 192 384 576 219 438 657 273 546 819 327 654 981 hyp@debian:~$
这个我觉的应该是有很多的算法的,我没还没看过多少算法的知识,现写成如上。
------------------------------------------20121127-------------------------------
这个不是我想出来的。确实这个简短多了,也高效多了,我进行了许多无用的思考。事实上,检验可以放到最后,一些判断也可以精简掉。哈哈,长见识了,每个人都有思维的误区,考虑的太草率了。
#include<stdio.h> int main() { int a,b,c,i,j,s[9]; for (a=100;a<333;a++) { b=2*a;c=3*a; s[0]=a%10;s[1]=a%100/10;s[2]=a/100; s[3]=b%10;s[4]=b%100/10;s[5]=b/100; s[6]=c%10;s[7]=c%100/10;s[8]=c/100; for(i=0;i<8;i++) { for(j=i+1;j<9;j++) if(s[i]==s[j]) break; if(j<9) break; } if((i==8)&&(j==9)) printf("%d,%d,%d\n",a,b,c); } return 0; }
相关文章推荐
- (最简单的)用1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。
- 用C++将1,2...9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例
- 1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。
- 排序组合方法,选出3个数,组成不同的三位数,要求每个三位数不相等
- 1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解的两种解法
- 用1~9的9个数字组成三个三位数,成1:2:3的比例
- 用1,2,3...9组成3个三位数abc, def, ghi, 每个数字恰好使用一次,且abc:def:ghi=1:2:3,输出所有解。
- 用1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解
- 排列(permutation):用1,2,3,...,9组成3个三位数abc, def和ghi,每个数字恰好使用一次,要求abc:def:ghi = 1:2:3。输出所有解。提示:不必太动脑筋。
- 用1,2,3……,9组成3个三位数,比例为1:2:3,且每个数只能用一次。
- 用1,2,3…9组成3个三位数abc, def, ghi, 每个数字恰好使用一次,且abc:def:ghi=1:2:3,输出所有解。 用1,2,3…9组成3个三位数abc, def, ghi, 每个数
- 10进制转62进制,实现穷举指定位数的所有密码组合(暴力破解)
- 1/22 测试一(STL 模拟 贪心)A.(next_permutation() 求四个数字组成的所有四位数) 排列2
- 神秘的三位数 有这样一个3位数,组成它的3个数字阶乘之和正好等于它本身。即:abc = a! + b! + c!
- 已知abc+cba = 1333,其中a,b,c均为一位数,编程求出满足条件的a,b,c所有组合。
- 1-9九个数字不重复组成一个三位数加法算式,求出所有组合
- 1~9的9个数组成9位数并前n为能被n整除
- 试题系列一(求4,5,6,7所有四位数的排列组合)
- 用1,2,3,4,5,6,7,8,9这9个数字组成一个九位数。
- Python输出1,2,3,4组成的所有三位数