解题思路:

        首先明确问题:题目要求从1到9这9个数字中三个一组组成三个三位数(我们用abc,def,ghi来表示,设定abc<def<ghi),并有abc:def:ghi=1:2:3,且abc,def,ghi不能有重复得数字。

        思路:首先我们先算出最小的数(abc)的范围;要求不重复,则最小的数肯定为123,那么最大的数是987了(987是所有不重复三位数中最大的);因为要的是abc的最大值,所以根据比例可以的到abc最大为987/3=329;那么我们现在可以确定abc的范围是 123 <=abc <=329;然后遍历123到329这个范围,判断每一个数字是否符合要求,(def、ghi怎么确定??)abc知道了,def=2*abc、ghi=3*abc,这就自然确定了;在遍历过程中判断每一组(abc、def、ghi)数是否符合要求,如果符合要求打印,不符合要求,继续遍历下一组;我们可以使用一个数组大小为10作为标志数组;在遍历过程中把abc、def、ghi分别分解出每一位的数字,然后把该数字对应的数组下标的元素值为1;这样在一次遍历结束之后,只用判断数组中除了0号为的每一个数组的元素是否都为1,如果都为1;则打印;反之,继续下次遍历;当然你使用循环也可以做的我所述的结果;我代码中的实现我所述的这个过程并非循环;大家可以研究一下(这里就不多说了,这个过程的方法很多)。


                    谢谢,什么时候写作水平能提高啊, 不懂得留言  谢谢

注意事项:

参考代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <functional> 
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	int flag[10];
	for(int abc = 123; abc <= 329; ++abc)
	{
		memset(flag,0,sizeof(flag));
		flag[abc/100] = flag[abc/10%10] = flag[abc%10] = 1;
		int def = 2*abc;
		flag[def/100] = flag[def/10%10] = flag[def%10] = 1;
		int ghi = 3*abc;
		flag[ghi/100] = flag[ghi/10%10] = flag[ghi%10] = 1;
		if(flag[0] == 0)
		{
			sort(flag,flag+10);
			if(flag[1] != 0)
			{
				printf("%d %d %d\n", abc, def, ghi); 
			} 
		}
	}
	return 0;
}


点赞(3)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 4 条评论

4年前 回复TA
@空格c位 14行可以直接理解为数组初始化,第8行是C++里面的,C中可以不要,22行是C++排序函数,如果要用C语言,则这个排序函数要自定义,自己编写.
咖啡 6年前 回复TA
注意我思路得每一句话。
咖啡 6年前 回复TA
@空格c位 第八行我用到了C++编译指令 第14行是string.h 中得一个函数是把数组得所有元素设置为0,每次都要置零不影响下一次使用,第22行是C++中得排序函数,从小到大(如果你没学过C++,你可以用我说的另一种方法来实现这部分->循环);
空格c位 6年前 回复TA
思路懂了,不过第8,14,22行,是真不理解。