题目描述
把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。
关键代码:
int j = i + 1
if (k <= j)
continue;
这两个关键代码,导致不会出现重复的情况!!!
法一:
代码如下:
#include <iostream>
#include <sstream>
using namespace std;bool check(int x) {stringstream ss;ss << x;string str;ss >> str;for (int i = 0; i < str.size(); i++) {if (str[i] == '2' || str[i] == '4')return false;}return true;
}int main() {ios::sync_with_stdio(false);cin.tie(0);int ans = 0;for (int i = 1; i * 3 <= 2019; i++)for (int j = i + 1; i + j * 2 <= 2019; j++) {int k = 2019 - i - j;if (k <= j)continue;if (check(j) && check(i) && check(k)) {ans++;}}cout << ans << endl;return 0;
}
法二:
#include <iostream>
using namespace std;
int ans = 0;bool check(int x) {while (x) {int c = x % 10;if (c == 4 || c == 2)return false;x = x / 10;}return true;
}int main() {for (int i = 1; i < 2019; i++)for (int j = i + 1; j < 2019; j++) {int k = 2019 - i - j;if (k <= j)continue;if (check(i) && check(j) && check(k))ans++;}cout << ans << endl;return 0;
}
优化:
#include <iostream>
using namespace std;
int ans = 0;bool check(int x) {while (x) {int c = x % 10;if (c == 4 || c == 2)return false;x = x / 10;}return true;
}int main() {for (int i = 1; i * 3 < 2019; i++)for (int j = i + 1; i + j * 2 < 2019; j++) {int k = 2019 - i - j;if (k <= j)continue;if (check(i) && check(j) && check(k))ans++;}cout << ans << endl;return 0;
}