p1008三连击
三连击
首先,第一种做法是将一个用一个向量(vector)数组里面装满1-9的所有数字,再用next_permutation进行全排列,用if条件语句筛选出符合结果的输出
点击查看代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> digits = {1, 2, 3, 4, 5, 6, 7, 8, 9};
do {
// 组成三个三位数
int a = digits[0] * 100 + digits[1] * 10 + digits[2];
int b = digits[3] * 100 + digits[4] * 10 + digits[5];
int c = digits[6] * 100 + digits[7] * 10 + digits[8];
// 检查是否满足 1:2:3 比例
if (b == 2 * a && c == 3 * a) {
cout << a << " " << b << " " << c << endl;
}
} while (next_permutation(digits.begin(), digits.end()));
return 0;
}
但是这样的做法有一个坏处就是太浪费空间空间,算法的时间复杂度比较高,是数字的全排列的结果,即为O(9!)虽然不算得上高,却也有浪费,因此提出一个更好的解决方案——只对a进行全排列
再对b,c分别乘对应的倍数,转化为字符串,再用sort函数排列,与123456789的字符串比较,如果相等,则存在a,b,c,不等则相反。
经此处理之后,复杂度降为O(9*(329-123))=O(1800),远胜于前者。
点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool isValid(int a, int b, int c) {
// 将三个数转为字符,拼接成字符串,检查是否恰好包含 1~9
string s = to_string(a) + to_string(b) + to_string(c);
if (s.size() != 9) return false;
sort(s.begin(), s.end());
return s == "123456789";
}
int main() {
for (int a = 123; a <= 329; a++) { // a 必须是三位数,且 3a <= 999
int b = 2 * a;
int c = 3 * a;
if (isValid(a, b, c)) {
cout << a << " " << b << " " << c << endl;
}
}
return 0;
}