程序设计入门6 排列

排列(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,即不加括号的数组表示地址。所以在子函数中改变数组的值,子函数里面数组的值也改变。

猜你喜欢

转载自blog.csdn.net/qq2285580599/article/details/78981433