题目:
思路:
题目很简单,直接暴力求解,但是需要注意的题中所给的条件,交换顺序为相同的方法&&三个正整数不能相同,我本来想到的是使用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 容器的大小