数的分解(2019第十届蓝桥杯C/C++B组省赛第四题)

版权声明:盗版必究 https://blog.csdn.net/qq_42837885/article/details/88906770

问题描述

【问题描述】 本题总分:10 分
把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包
含数字 2 和 4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和
1001+1000+18 被视为同一种。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

算法设计与思路

比赛的时候我只想到了暴力求解,程序没有模块化,代码过于复杂,以至于考虑不周全,白白损失十分。

  1. 此题应该使用三层for循环,循环都从1循环到2017。判断三个数不相等且每个数都不包含数字2和4,相加等于2019,满足判断条件累加器加1,累加器最后除以6则是正确答案。
  2. 这个题虽说用暴力法可以求解,但我们要想想如何优化,降低时间复杂度。首先不考虑数字里包不包含2和4,我们使是三个数升序排列,a1<a2<a3,这就排除了重复的可能性,三个数最接近的情况就是672,673,674。这表示升序的第一个数最大值为672,升序的第三个数最小值为674。我们用两层循环,第一层循环代表升序的第一个数,从1循环到672,第二层循环代表升序的第三个数,从674循环到2017,升序中间的数就可以通过2019减去这两个数求解。当满足a1<a2<a3且每个数里不包含2和4时累加器加1,循环结束时
    答案:40785

代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int bubh(int i, int j, int k)
{
	int t = 1;
	while (i)
	{
		if (i % 10 == 2 || i % 10 == 4)
		{
			t = 0;
			break;
		}
		else
			i = i / 10;
	}
	while (t == 1 && j)
	{
		if (j % 10 == 2 || j % 10 == 4)
		{
			t = 0;
			break;
		}
		else
			j = j / 10;
	}
	while (t == 1 && k)
	{
		if (k % 10 == 2 || k % 10 == 4)
		{
			t = 0;
			break;
		}
		else
			k = k / 10;
	}
	return t;
}

int main()
{
	int i, j, k;
	long long sum = 0;
	for (i = 1; i <= 672; i++)
	{
		for (k = 674; k <= 2017; k++)
		{
			j = 2019 - i - k;
			if ((i<j && j < k)  && (bubh(i, j, k) == 1))
				sum++;
		}
	}
	printf("%I64d\n", sum);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42837885/article/details/88906770
今日推荐