[NOIP1998 普及组] 三连击 C++/Java
洛谷P1008
题目背景
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。
题目描述
将 $1, 2, \ldots , 9$ 共 $9$ 个数分成 $3$ 组,分别组成 $3$ 个三位数,且使这 $3$ 个三位数构成 $1 : 2 : 3$ 的比例,试求出所有满足条件的 $3$ 个三位数。
输入格式
无
输出格式
若干行,每行 $3$ 个数字。按照每行第 $1$ 个数字升序排列。
样例 #1
样例输入 #1
无
样例输出 #1
192 384 576
* * *
...
* * *
(剩余部分不予展示)
提示
NOIP1998 普及组 第一题
C++
#include<bits/stdc++.h>
using namespace std;
string temp;
bool flag = false,isgood=true;
signed main() {
map<char, int> map;
for (int i = 192; i < 333; i++) {
for (int j = 384; j < 1000; j++) {
for (int k = 576; k < 1000; k++) {
if (i * 2 == j and i * 3 == k) {
temp.append(to_string(i)).append(to_string(j)).append(to_string(k));
for (auto c: temp) {
if (map.count(c) == 0) map[c] = 1;
else isgood = false;
}
if (map.count('0') != 0) isgood = false;
if (flag && isgood) cout << "\n";
if (isgood) {
printf("%d %d %d", i, j, k);
if (!flag) flag = true;
break;
}
}
}
}
}
}
Java
import java.util.*;
public class Main {
public static void main(String[] args) {
boolean flag = false;
for (int i = 192; i < 333; i++) {
for (int j = 384; j < 1000; j++) {
for (int k = 576; k < 1000; k++) {
if (i * 2 == j && i * 3 == k) {
String t = String.valueOf(i) + j + k;
boolean isgood = true;
Hashtable<Character, Integer> map = new Hashtable<>();
for (int l = 0; l < t.length(); l++) {
if (map.containsKey(t.charAt(l))) isgood = false;
else map.put(t.charAt(l), 1);
}
if (map.containsKey('0')) isgood = false;
if (flag && isgood) System.out.println();
if (isgood) {
System.out.printf("%d %d %d", i, j, k);
if (!flag) flag = true;
break;
}
}
}
}
}
}
}