排列(一)(permutation)
用1,2,3,4,5,6,7,8,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi = 1:2:3。按照”abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。
思路:定义一个数组a[10],先将数组全部赋0值,此处从123开始循环到329(三位数最大的是999,而999除以3是333,又因为33重复,所以最大到329),将a[出现的数字]改为1,最后将数组的值相加,若合为9,则1—9全部出现,若有重复数字则数组之和就不为9。
C语言:
此处C语言代码引自http://blog.csdn.net/ramay7/article/details/50070799
#include <stdio.h>
#include <string.h>
int main()
{
int x,y,z,a[10],i,s;
memset(a,0,sizeof(a));
for(x=123;x<329;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;
s=0;
for(i=1;i<10;i++)
s+=a[i];
if(s==9)
printf("%d\t%d\t%d\n",x,y,z);
memset(a,0,sizeof(a)); //重新赋值为0
}
return 0;
}
Java:
public class Code {
public static void main(String[] args) {
int x,y,z,s;
int[] a ;
a = new int[10];
for(int i=1;i<10;i++){
a[i] = 0;
}
for(x = 123; x<=329 ; x++){
y = x*2;
z = x*3;
a[x/100] = a[x%100/10] = a[x%10] = 1;
a[y/100] = a[y%100/10] = a[y%10] = 1;
a[z/100] = a[z%100/10] = a[z%10] = 1;
s=0;
for(int i=1;i<10;i++)
s+=a[i];
if(s==9)
System.out.println(x+" "+y+" "+z);
for(int i=1;i<10;i++) //重新赋值为0
a[i]=0;
}
}
}
我看还有其他博主用next_permutation() 和 prev_permutation() ,这两个排列组合函数书写详情请见:http://blog.csdn.net/liveway6/article/details/51896950