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 %d\n",abc, def, hij);
// 重置数组
count = 0;
memset(a,0,sizeof(a));
}
return 0;
}