前提摘要
高中毕业,曾经学习的编程知识遗忘较多,计划这个暑假重拾编程基础,计划从NOIP往年普及组和提高组的题目入手,回顾基础知识,刷题找手感。
今日题目
[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
* * *
...
* * *
(剩余部分不予展示)
解题思路
① 先不考虑数字重复的情况,把所有符合
1
:
2
:
3
1:2:3
1:2:3 的数字枚举出来。
② 考虑数字不能重复的条件,想到用
h
a
s
h
hash
hash 来标记查重。
代码实现
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int num1,num2,num3;
int ha[15];
int numcheck(int a,int b,int c){
int flag=1;
memset(ha,0,sizeof(ha));//记得清空数组
while(a){
int i=-1; i=a%10; a/=10;
ha[i]=1;
if(i==0) flag=0;
}
while(b){
int i=-1; i=b%10; b/=10;
if(i==0) flag=0;
if(ha[i]) flag=0;
else ha[i]=1;
}
while(c){
int i=-1; i=c%10; c/=10;
if(i==0) flag=0;
if(ha[i]) flag=0;
else ha[i]=1;
}
return flag;
}
int main()
{
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
if(j==i) continue;
for(int k=1;k<=9;k++){
if(k==i||k==j) continue;
num1=i*100+j*10+k;
num2=2*num1; num3=3*num1;
if(numcheck(num1,num2,num3)) cout<<num1<<' '<<num2<<' '<<num3<<endl;
}
}
}
return 0;
}
复习收获
① 敲得时候忘了清空数组的
m
e
m
s
e
t
memset
memset 数组,查了查恍然大悟。
② 数组命名的时候第一遍命名的
h
a
s
h
[
i
n
t
]
hash[int]
hash[int] ,本地编译没问题,交到平台上显示
C
o
m
p
i
l
e
E
r
r
o
r
Compile Error
CompileError,后来改成了
h
a
[
i
n
t
]
ha[int]
ha[int] ,顺利
A
C
AC
AC 。