Description
把一个正整数N分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
注:不包含2和4指整数的各个位上的数都不为2且不为4。
Input
第一行一个整数T,表示输入有T组。
对于每一组输入数据,输入为一个正整数N。(3 < N < 2020)
Output
对每组输入数据,输出一个正整数,表示分解方法。
Sample Input
3
8
9
12
Sample Output
0
1
2
More Info
对样例的解释:
8没有满足要求的分解。
9分解为:1、3、5。
12分解为:1、3、8或1、5、6。
#include<iostream> //#include<fstream> using namespace std; bool check(int n){ while(n){ if(n%10==2||n%10==4){ return false; } n/=10; } return true; } int main(){ int n,a; // fstream file("haha.txt"); // file>>n; cin>>n; int sum; while(n--){ // file>>a; cin>>a; sum=0; for(int i=1;i<a;i++){ if(check(i)){ for(int j=i+1;a-i-j>j;j++){ if(check(j)&&check(a-i-j)){ sum++; } } } } cout<<sum<<endl; } return 0; }
直接用暴力搜索法,直接搜可能会超时,要进行一些优化
第一个数设成i,第二个数设成i+1,第三个数设成a-i-j,这样设置的原因是:
1.因为题目说不能重复,
2.要排除掉重复的结果,比如,对9进行分解的话,答案只有一种,就是1,3,5,但如果用无脑的搜索的话,答案会是6种,就会变成1,3,5的全排列,但题目中要求去除掉重复的。
然后就是检验分解成的数是否符合条件,就是检验是否含有2和4,这很简单,假设要检验的数是n,就是n对10取模,这样能得到n这个数的个位上的数字,判断它是不是2或4,然后n=n/10,相当于舍弃掉了n个位上的数字,这样就能把n各个位上的数字都检验过来。