纯暴力解,也可以剪枝优化:利用题设条件:三个数相加等于2019,即a+b+c=2019,c可以用2019-(a+b)算出
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll res;
bool check(ll x){
while(x){
if(x%10 == 2 || x%10 == 4)
return false;
x/=10;
}
return true;
}
int main(){
for(int i = 1; i < 2019; i++)
for(int j = 1; j < 2019; j++)
for(int k = 1; k < 2019; k++){
if(i + j + k == 2019){
//去掉重复的数即 三个数相等的情况
if(i != j && j != k && i != k){
//判断这三个数是否满足题设条件 即 每个正整数都不包含数字 22 和 44
if(check(i) && check(j) && check(k)){
res++;
}
}
}
}
//注意去重
printf("%lld",res/6);
return 0;
}剪枝优化代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll res;
bool check(ll x){
while(x){
if(x%10 == 2 || x%10 == 4)
return false;
x/=10;
}
return true;
}
int main(){
for(int i = 1; i < 2019; i++)
for(int j = 1; j < 2019-i; j++){
int k=2019 - i - j; //剪枝
if(check(i) && check(j) && check(k) && i < j && j < k){ //避免重复计算
res++;
}
}
cout<<res<<endl;
return 0;
}继续优化
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll res;
bool check(ll x){
while(x){
if(x%10 == 2 || x%10 == 4)
return false;
x/=10;
}
return true;
}
int main(){
for(int i = 1; i < 2019/3; i++)
for(int j = 1; j < 2019-i; j++){ // j 的上限为 2019 - i
int k=2019 - i - j; //剪枝
if(check(i) && check(j) && check(k) && i < j && j < k){ //避免重复计算 // 确保 i, j, k 都不包含 2 或 4
res++;
}
}
cout<<res<<endl;
return 0;
}
0 回复
0 转发
3 喜欢
0 阅读



