返回题解分享
讨论 / 题解分享/ 帖子详情

数的分解(结果填空) - 题解

纯暴力解,也可以剪枝优化:利用题设条件:三个数相加等于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 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!