题目
- 题目参考网址:https://vjudge.net/problem/UVA-725
- 大意:
给一个数字n,用0~9,10个数字组成两个五位数,使得他们的商为n,按顺序输出所有结果 (可以有前导0)
知识点
- 暴力求解 - 简单枚举
思路
不需要abcde和fghij都进行枚举,只需要枚举一个,另一个相乘n即可得到,最后进行判重,如果没有重复(把串进行排序后,从头开始遍历检查是否递增0-1-2-3-…-9,如果没有递增说明出现重复)则说明满足条件进行输出。
代码
# include <iostream>
# include <cstdio>
# include <stack>
using namespace std;
bool is_ok(string in) {
for (int i = 1; i < in.length(); i++) {
// 从头开始遍历检查是否递增0-1-2-3-..-9
if (in[i - 1] + 1 != in[i])
return false; // 如果没有递增说明出现重复
}
return true;
}
int main() {
int n = 0, abcde, fghij = 1000; scanf("%d", &n);
while (fghij < 100000) {
abcde = fghij * n; // 得到另一组数组
if(abcde > 100000) break; // 超过了,因为是递增的所以后面的一定超过5位,跳出
// 使用了string检查
string a, b;
a = to_string(abcde); // 转换为字符串
if(fghij < 10000) b = "0" + to_string(fghij); // 可能出现有前导0(例如01234)
string check = a + b;
sort(check.begin(), check.end());
// 检查是否重复
if (is_ok(check)) {
cout << a << " / " << b << " = " << n << endl;
}
fghij++;
}
}
过程中遇到的问题 & 解决
- 注意前导可以有0即可,枚举一个反过来得到另一个检查是否重复(用排序的方式很巧妙),不用abcdefghij全排列,极大减少枚举量。
- c++11引入了
to_string()
- 可以转换为字符串,比较方便。也可以使用stoi()
将字符串转为int。
测试
输入:
62
结果:
79546 / 01283 = 62
94736 / 01528 = 62