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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)