回文数字

我用的是set自增有序造回文数字。

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <string.h>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>

#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 3000
#define MAX 0x06FFFFFF
#define V vector<int>

using namespace std;

set<string> nums[10];

void configureDigit(int x){
    char ch[2]={0};
    int i;
    if(x==1){
        FF(i,10){
            ch[0]=48+i;
            nums[1].insert(string(ch));
        }
    }else if(x==2){
        FF(i,10){
            ch[0]=48+i;
            nums[2].insert(string(ch)+string(ch));
        }        
    }else{
        set<string>& p=nums[x-2];
        set<string>::iterator it=p.begin();
        while(it!=p.end()){
            string s=*it;
            FF(i,10){
                ch[0]=48+i;
                nums[x].insert(string(ch)+s+string(ch));
            }    
            it++;
        }
    }
}

int eq=60;

bool legal(string& s){
    if(s[0]==48) return 0;
    int i,sum=0;
    FF(i,s.size()) sum+=s[i]-48;
    if(sum!=eq) return 0;
    return 1;
}

int main(){
    I("%d",&eq);
    int i;
    bool ok=0;
    F(i,1,7) configureDigit(i);
    F(i,5,7){
        set<string>::iterator it=nums[i].begin();
        while(it!=nums[i].end()){
            string s=*it;
            if(legal(s)){
                puts(s.c_str());
                ok=1;
            }
            it++;
        }        
    }
    if(!ok) O("-1");
    return 0;
}
原文地址:https://www.cnblogs.com/TQCAI/p/8653781.html