洛谷刷题--P1008 三连击

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

将 1,2,…,9共 9 个数分成 3组,分别组成 3 个三位数,且使这 3 个三位数构成 1:2:3 的比例,试求出所有满足条件的 3 个三位数。

输入格式

输出格式

若干行,每行 3 个数字。按照每行第 1 个数字升序排列。

输入输出样例

输入 #1复制

输出 #1复制

192 384 576
* * *
...

* * *
(剩余部分不予展示)

题解:

1.由题意需要找到三个三位数 他们由1~9不重复组成 且 他们之间的比为 1:2:3,根据这个可以构造一个三元组(i,j,k),使 j = 2i , k = 3i,枚举三元组,并筛选满足条件的,统计次数

2.对于1~9不重复的数字组成三个三位数,可以考虑取出每一位并在一个bool类型的数组中进行标记。

代码如下:

#include<iostream>
using namespace std;
bool num[10] = { 0 };//保存是否出现过数字i num[i]为true则说明出现过
//判断i,j,k的每位是否有重复
bool judge(int i, int j, int k){

	while (i)
	{
		int bit = i % 10;
		if (num[bit]||bit == 0)//已经出现过这个数字或者数字为0,则说明不满足条件
			return false;
		else
			num[bit] = true;
		i /= 10;
	}

	while (j)
	{
		int bit = j % 10;
		if (num[bit] || bit == 0)
			return false;
		else
			num[bit] = true;
		j /= 10;
	}

	while (k)
	{
		int bit = k % 10;
		if (num[bit] || bit == 0)
			return false;
		else
			num[bit] = true;
		k /= 10;
	}
	return true;
}

int main(){
	int i, j, k; //三元组(i,j,k)***
	//满足 j = 2i , k = 3i
	for (i = 123; i <= 987 / 3; i++){
		//枚举三元组 与 三元组的范围确定
		j = 2 * i;
		k = 3 * i;
		if (judge(i, j, k))
			cout << i << " " << j << " " << k << endl;
		for (int i = 1; i < 10; i++)//重置bool数组
			num[i] = false;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值