题意:给定n,找出数位之和为n的所有五位数和六位数,按从小到大的顺序输出。
暴力枚举:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
for(int i=10000;i<100000;++i){
int a=i/10000;
int b=i/1000%10;
int c=i/100%10;
int d=i/10%10;
int e=i%10;
if(a+b+c+d+e==n&&a==e&&b==d) printf("%d\n",i);
}
for(int i=100000;i<1000000;++i){
int a=i/100000;
int b=i/10000%10;
int c=i/1000%10;
int d=i/100%10;
int e=i/10%10;
int f=i%10;
if(a+b+c+d+e+f==n&&a==f&&b==e&&c==d) printf("%d\n",i);
}
}
dfs:
#include<bits/stdc++.h>
using namespace std;
int a[10];
int n;
vector<int>v;
void dfs(int len){
if(len==3){
int s=0;
if((a[0]+a[1]+a[2])*2==n){
s=s*10+a[0];s=s*10+a[1];s=s*10+a[2];s=s*10+a[2];s=s*10+a[1];s=s*10+a[0];
v.push_back(s);
}
s=0;
if((a[0]+a[1])*2+a[2]==n){
s=s*10+a[0];s=s*10+a[1];s=s*10+a[2];s=s*10+a[1];s=s*10+a[0];
v.push_back(s);
}
return;
}
for(int i=0;i<10;++i){//每一位从0~9填
if(!len&&!i) continue;//首位不为0
a[len]=i;
dfs(len+1);
}
}
int main(){
scanf("%d",&n);
dfs(0);
sort(v.begin(),v.end());
for(int i=0;i<v.size();++i) printf("%d\n",v[i]);
}
注:一开始没放到vector里存,遇到答案直接输出了,但没考虑到这样找到的答案不是从小到大。
dfs比暴力枚举快。