本文由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 num
for i in range(3):
num[int(n % 10)] = 1
n = (n - n % 10) / 10
def check(): #该函数用于检查是否出现1~9所有数字
global num
for i in range(1,10):
if num[i] == 0:
return 0
return 1
def init(): #初始化列表
global num
num = [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。
结尾
还有别的思路吗?欢迎评论区留言哦!记得关注我啊(˃ ⌑ ˂ഃ ),我们下期再见!
本文详细解析了如何通过暴力枚举和布尔值表来解决一道编程竞赛题目,涉及C++和Python代码示例。

814

被折叠的 条评论
为什么被折叠?



