2019第十届蓝桥杯省赛C++(B组)D :数的分解

题目:

2019第十届蓝桥杯省赛C++(B组)D :数的分解_第1张图片

思路:

题目很简单,直接暴力求解,但是需要注意的题中所给的条件,交换顺序为相同的方法&&三个正整数不能相同,我本来想到的是使用set容器和strcut来判断是否为相同的元素,但是后来始终出不了答案,后记中详细解释。

代码:

/**
 *                             _ooOoo_
 *                            o8888888o
 *                            88" . "88
 *                            (| -_- |)
 *                            O\  =  /O
 *                         ____/`---'\____
 *                       .'  \\|     |//  `.
 *                      /  \\|||  :  |||//  \
 *                     /  _||||| -:- |||||-  \
 *                     |   | \\\  -  /// |   |
 *                     | \_|  ''\---/''  |   |
 *                     \  .-\__  `-`  ___/-. /
 *                   ___`. .'  /--.--\  `. . __
 *                ."" '<  `.___\_<|>_/___.'  >'"".
 *               | | :  `- \`.;`\ _ /`;.`/ - ` : | |
 *               \  \ `-.   \_ __\ /__ _/   .-` /  /
 *          ======`-.____`-.___\_____/___.-`____.-'======
 *                             `=---='
 *          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 *                     佛祖保佑        永无BUG
*/


/*
标题:数的分解 
	把2019 分解成3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?
	注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和 1001+1000+18 被视为同一种。
*/ 



#include
#include
#include
#include
#include
#include 
#include 
#include
#include
#include
#include
using namespace std;
struct myNum {
	int a;
	int b;
	int c;
	myNum(int A, int B, int C)
	{
		a = A;
		b = B;
		c = C;
	}
	bool operator < (const myNum &A)const
	{
		if(this->aa==A.a&&this->ba==A.a&&this->b==A.b&&this->c num;
	for (int i = 1; i <= 2018; i++)
	{
		for (int j = 1; j <= 2018; j++)
		{
			for (int k = 1; k <= 2018; k++)
			{
				if (i + j + k>2019)
				{
					break;
				}
				else if (i + k + j == 2019 && funcA(i) && funcA(j) && funcA(k) && i != j && j != k && k != i)
				{
					arr[0] = i;
					arr[1] = j;
					arr[2] = k;
					sort(arr, arr + 3);
//					cout << arr[0] << " " << arr[1] << " " << arr[2] << endl;
					myNum thisNum(arr[0], arr[1], arr[2]);
					num.insert(thisNum);
				}
			}
		}
	}
	cout << num.size() << endl;
	return 0;
}
/*
	答案:40785
*/


后记:

在使用set 容器时,发现程序无法正常运行,竞赛的时候用了另外一种方法,但是又没有看到是需要三个数不相同,惨痛失分,以后编程真的是需要仔细啊。赛后重新把代码写了一遍,在网上查到了错误的原因,set 容器对于int double float string 类型的可以判断insert 进去的元素是否相同,并由小到大进行排序,但是对于结构体类的元素则不行,需要对 < 符号进行重载,如下

对于结构体num

	myNum(int A, int B, int C)
	{
		a = A;
		b = B;
		c = C;
	}

需要对 < 进行如下重载

	bool operator < (const myNum &A)const
	{
		if(this->aa==A.a&&this->ba==A.a&&this->b==A.b&&this->c

这里在对结构体当中的元素进行重载的时候需要注意的是,对于每一个元素都要进行比较,当有多个数值元素时依次如上比较,这样set 容器才能对insert 进去的元素进行大小与相同判断,才能在最后使用size() 输出set 容器的大小

你可能感兴趣的:(c++)