本文主要是介绍洛谷 P1008 [NOIP1998 普及组] 三连击,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。
因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。
违者必究,谢谢配合。
个人主页:blog.csdn.net/jzwalliser
题目
洛谷 P1008 [NOIP1998 普及组] 三连击
[NOIP1998 普及组] 三连击
题目背景
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。
题目描述
将 1 , 2 , … , 9 1, 2, \ldots , 9 1,2,…,9 共 9 9 9 个数分成 3 3 3 组,分别组成 3 3 3 个三位数,且使这 3 3 3 个三位数构成 1 : 2 : 3 1 : 2 : 3 1:2:3 的比例,试求出所有满足条件的 3 3 3 个三位数。
输入格式
无
输出格式
若干行,每行 3 3 3 个数字。按照每行第 1 1 1 个数字升序排列。
样例 #1
样例输入 #1
无
样例输出 #1
192 384 576 * * * ...* * * (剩余部分不予展示)
想法
首先,题目主要的意思是:找到三个三位数,分别为 n n n、 2 n 2n 2n和 3 n 3n 3n,而且这三个三位数包含 1 1 1~ 9 9 9的所有数字。
那么,立即可以想到一种暴力枚举的方法:将 100 100 100~ 999 999 999所有数字枚举一遍。那么,对于数字 n n n来说,只需要试 100 100 100~ 333 333 333即可(因为 3 n ≤ 999 3n\leq 999 3n≤999)。
实现
- 建立一个布尔值的对照表,出现的数字标记为 1 1 1,没有出现的数字标记为 0 0 0。
- 枚举 1 1 1~ 333 333 333,并把出现的数字标记下来。
- 每次枚举后,都检查:是否出现啦 1 1 1~ 9 9 9所有数字,若有则输出,没有则继续枚举。
题解
C++
#include<iostream>
using namespace std;
bool num[12]; //建立布尔值表
void sep(int n){ //该函数用于拆分数字for(int i = 0;i < 3;i++){num[n % 10] = 1;n /= 10;}
}bool check(){ //该函数用于检查是否出现1~9所有数字for(int i = 1;i <= 9;i++){if(num[i] == 0){return 0;}}return 1;
}void init(){ //初始化列表for(int i = 1;i <= 9;i++){num[i] = 0;}
}int main(){for(int i = 100;i < 333;i++){int a = i * 2;int b = i * 3;sep(i); //拆分数字sep(a); //拆分数字sep(b); //拆分数字if(check()){cout << i << " " << a << " " << b << "\n";}init(); //初始化列表}return 0;
}
Python
num = [0,0,0,0,0,0,0,0,0,0] #建立布尔值表
def sep(n): #该函数用于拆分数字global numfor i in range(3):num[int(n % 10)] = 1n = (n - n % 10) / 10def check(): #该函数用于检查是否出现1~9所有数字global numfor i in range(1,10):if num[i] == 0:return 0return 1def init(): #初始化列表global numnum = [0,0,0,0,0,0,0,0,0,0]for i in range(100,334):sep(i) #拆分数字sep(i * 2) #拆分数字sep(i * 3) #拆分数字if check():print(i,i * 2,i * 3)init()
难度
难度:★☆☆☆☆
这道题并不是很难,只要稍动脑筋就可以想出来。主要考察暴力枚举算法,以及如何拆分数字:先模 10 10 10,再除以 10 10 10。
结尾
还有别的思路吗?欢迎评论区留言哦!记得关注我啊(˃ ⌑ ˂ഃ ),我们下期再见!
这篇关于洛谷 P1008 [NOIP1998 普及组] 三连击的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!