标签:原因 fstream als for 简单 数字 排列 class ace
1 #include<iostream> 2 //#include<fstream> 3 using namespace std; 4 bool check(int n){ 5 while(n){ 6 if(n%10==2||n%10==4){ 7 return false; 8 } 9 n/=10; 10 } 11 return true; 12 } 13 int main(){ 14 int n,a; 15 // fstream file("haha.txt"); 16 // file>>n; 17 cin>>n; 18 int sum; 19 while(n--){ 20 // file>>a; 21 cin>>a; 22 sum=0; 23 for(int i=1;i<=a;i++){ 24 if(check(i)){ 25 for(int j=i+1;a-i-j>j;j++){ 26 if(check(j)&&check(a-i-j)){ 27 sum++; 28 } 29 } 30 } 31 } 32 } 33 cout<<sum<<endl; 34 return 0; 35 }
直接用暴力搜索法,直接搜可能会超时,要进行一些优化
第一个数设成i,第二个数设成i+1,第三个数设成a-i-j,这样设置的原因是:
1.因为题目说不能重复,
2.要排除掉重复的结果,比如,对9进行分解的话,答案只有一种,就是1,3,5,但如果用无脑的搜索的话,答案会是6种,就会变成1,3,5的全排列,但题目中要求去除掉重复的。
然后就是检验分解成的数是否符合条件,就是检验是否含有2和4,这很简单,假设要检验的数是你,就是n对10取模,这样能得到n这个数的个位上的数字,判断它是不是2或4,然后n=n/10,相当于舍弃掉了n个位上的数字,这样就能把n各个位上的数字都检验过来。
标签:原因 fstream als for 简单 数字 排列 class ace
原文地址:https://www.cnblogs.com/fate-/p/12233220.html