题目:

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

思路:

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

代码:

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


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



#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<map>
#include <stdio.h>
#include <stdlib.h>
#include<set>
#include<cmath>
#include<iomanip>
#include<algorithm>
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->a<A.a)
		{
			return true;
		}
		else if(this->a==A.a&&this->b<A.b)
		{
			return true;
		}
		else if(this->a==A.a&&this->b==A.b&&this->c<A.c)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

};
bool funcA(int A)
{
	int B;
	while (A)
	{
		B = A % 10;
		if (B == 2 || B == 4)
		{
			return false;
		}
		A = A / 10;
	}
	return true;
}

int main()
{
	int arr[3];
	set<myNum> 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->a<A.a)
		{
			return true;
		}
		else if(this->a==A.a&&this->b<A.b)
		{
			return true;
		}
		else if(this->a==A.a&&this->b==A.b&&this->c<A.c)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

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

相关文章:

  • 2022-12-23
  • 2021-11-05
  • 2022-01-14
  • 2022-01-03
  • 2022-12-23
  • 2021-07-08
  • 2022-03-02
猜你喜欢
  • 2022-01-29
  • 2021-10-10
  • 2022-12-23
  • 2022-01-07
  • 2022-01-17
  • 2022-01-29
  • 2021-05-25
相关资源
相似解决方案