咖啡


私信TA

用户名:Tianxn

访问量:138173

签 名:

十年OI一场空,不开LL见祖宗。

等  级
排  名 10
经  验 27303
参赛次数 10
文章发表 197
年  龄 22
在职情况 学生
学  校 西安电子科技大学
专  业 软件工程

  自我简介:

解题思路:

        首先明确问题:题目要求从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;
}


 

0.0分

0 人评分

  评论区

注意我思路得每一句话。
2018-11-07 21:31:20
思路懂了,不过第8,14,22行,是真不理解。
2018-11-07 17:19:35
  • «
  • 1
  • »