哎这道题真是。。。我刚开始把题里边的输入一个正整数n误看成了这个要输出的五位数或者六位数每一位都是正整数,然后就大费周折的把有位数是0的给排除掉了最后还给错了
!!!!认真看题
我的思路,把结果分成六位数和五位数,五位数一定比六位数小,所以先输出五位数。判断的时候,只看三位,
如果第一位加第二位加第三位加第二位加第三位结果为n,则可以组成一个五位数;
如果第一位加第二位加第三位加第一位加第二位加第三位结果为n,则可以组成一个六位数
直接暴力法来做
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int six[900];
memset(six,0,sizeof(six));
//如果是5位数,
for(int i=100;i<=999;i++){
int res[4];
int k=0;
int skip=0;
int temp=i;
while(temp){
res[k++]=temp%10;
// if(temp%10==0){ //错因:::每一位都是正整数,如果是0,把这个数跳过
// skip=1;
// break;
// }
temp/=10;
}
// if(skip==1){
// continue;
// }
if(res[0]+res[1]+res[2]+res[1]+res[2]==n){
printf("%d%d%d%d%d\n",res[2],res[1],res[0],res[1],res[2]);
}
if(res[0]+res[1]+res[2]+res[0]+res[1]+res[2]==n){ //找到六位数字的和为n的数,但是由于题目里边说结果要从小到大输出,六位数一定大于五位数,所以在这不能输出
// printf("%d\n",i);
// printf("%d %d %d \n",res[2],res[1],res[0]);
six[i-100]=1;
}
}
//如果是6位数
for(int i=100;i<=999;i++){
if(six[i-100]==1)
{
// cout<<i<<endl;
int res[4];
int k=0;
int temp=i;
while(temp){
res[k++]=temp%10;
temp/=10;
}
printf("%d%d%d%d%d%d\n",res[2],res[1],res[0],res[0],res[1],res[2]);
}
}
return 0;
}
应该是最后一次刷蓝桥杯的题了,争取拿省一,加油!