C语言实现1:2:3的三个三位数的排列

C语言实现1:2:3的三个三位数的排列,第1张

C语言实现1:2:3的三个三位数的排列

1.题目描述

用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。

2.解题思路

首先看到1~9的不重复数字,连续的一串数,立马想到数组下标也是连续的。

每个数字恰好用一次,还要求abc:def:ghi=1:2:3,那么我们能先确定abc的范围:123~329。123,最小的好理解,那297呢?因为ghi最大是987,ghi = 3 abc, 那么abc最大值就是329。

那么接下来就是要考虑怎么找出所有满足的值。由于确定了abc的范围,那么在该范围内进行遍历,根据比例关系,def,  ghi的值也跟着变化。由于1~9是连续的一串数字,可以利用数组下标来存储每三位数中的每一位数,然后对应的数组元素的值取1。(初始化数组下标为0)

当数组下标出现重复的数时,它对应元素的值也会重复。所以只有当数组元素的和为9时,才满足这九个数被仅用一次。然后输出。

3.本题要点

要注意的是,在每一次遍历abc的值,统计出现1的个数后,都需要给计数和数组清零。

4.代码展示

int main()
{
	int abc, def, hij;
	int a[10], count = 0, i;  
	memset(a,0,sizeof(a)); // 初始化数组,把a中所有字节换作'0', 和 a[10] = {0} 一样   
	
	for (abc = 123; abc < 329; abc++) // 以abc为范围进行遍历 
	{
		def = abc * 2;
		hij = abc * 3;
		
		// 将a~j转化到数组下标中
		a[abc / 100] = 1; // a
		a[abc / 10 % 10] = 1; // b
		a[abc % 10] = 1; // c
		
		a[def / 100] = 1; // d
		a[def / 10 % 10] = 1; // e
		a[def % 10] = 1; // f
		
		a[hij / 100] = 1; // h
		a[hij / 10 % 10] = 1; // i
		a[hij % 10] = 1; // j
		
		// 统计出现不同下标的总数
		for (i = 1; i <= 9; i++)
		{
			count += a[i];
		 } 
			
		// 打印出这三个数
		if (count == 9) printf(" %d %d %dn",abc, def, hij);
		
		// 重置数组
		count = 0;
		memset(a,0,sizeof(a));
					
	}
	return 0;
 }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5657803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存