排列(permutation)
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。
一,标准答案:
#include<stdio.h>
int check_valid_num(int num, int array[])
{
int x = num / 100;
int y = num / 10 % 10;
int z = num % 10;
if (x == y || y == z || array[x] || array[y] || array[z])
{
return 0;
}
array[x] = array[y] = array[z] = 1;
return 1;
}
int main()
{
int array[10];
int i,j;
array[0] = 1;
for (i = 123; i <= 329; i++)
{
for (j = 1; j < 10; j++)array[j] = 0;
if (check_valid_num(i, array) && check_valid_num(i * 2, array) && (check_valid_num(i * 3, array)))
{
printf("%d %d %d\n", i, i * 2, i * 3);
}
}
}
二,心得体会
如何解决那个条件,即三个三位数九个数字各不相同,我一开始挨个比,但发现第二个比较一次,第三个比较两次,越来越多,这比较尴尬。
标准答案用的方法是建立一个10个元素的数组,第一个元素是1(为了让下标顺起来),其余的元素全为0,已经用过的标上1,这样一旦找出重复的便可立马pass掉。
注意一个细节,就是函数与数组的关系,形式参数int array()表示指针,实际参数array,即不加括号的数组表示地址。所以在子函数中改变数组的值,子函数里面数组的值也改变。