数的分解(蓝桥杯)

【问题描述】

把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,请问一共有多少种不同的分解方法?

注意:交换3个整数的顺序(如1000 + 1001 +18和1001+1000+18)被视为同一种分解方法。

【答案提交】

这是一道结果填空题,考生只需要算出结果并提交即可。本题的结果为一个整数,在提交答案时只需要填写这个整数,填写多余内容将无法得分。

【参考答案】

40785

【解析】

        本题可以枚举3个数字,但是如果3个数字都从1枚举到2019,则程序会变得比较复杂,应主要解决以下两个问题。

      (1)三数之和等于2019

      (2)解决重复情况

    对于(1)要满足i +j+k=2019,其实i和j一旦确定,k 的值就已经确定了,所以利用该式,定义的3个变量可以变成i、j、2019-i-j。

   对于(2),要想使3个数字不重复,则只需要将这3个数排序,保证排序后的序列是唯一的,即只要满足i < j < 2019-i-j就可以保证序列不重复。

对于保证数字不包含2和4的问题,可以取出数字的各位,然后判断每位上的数字与2或4是否相等。

【参考程序】

#include <iostream>
using namespace std; 
bool judeg(int a)
{
	while(a != 0)
	{
		int t = a % 10;
		if(t == 2 || t == 4)
		return 0;
		a = a / 10;
	}
	return 1;
}
int main(int argc, char** argv) {
	int sum = 0;
	for(int i = 1; i < 2019 / 3 + 1; i++)
	if(judeg(i))
	for(int j = i + 1; j < 2019 - i - j;j++)
	 if(judeg(j))
	 if(judeg(2019-i-j))
	 sum++;
	 cout << sum << endl;
	return 0;
}

运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值