【重拾计划】[NOIP1998 普及组] 三连击

前提摘要

高中毕业,曾经学习的编程知识遗忘较多,计划这个暑假重拾编程基础,计划从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 123 的数字枚举出来。
② 考虑数字不能重复的条件,想到用 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值