栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;
 }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/655716.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号