Problem J: 回文数

Problem J: 回文数

Time Limit: 3 Sec  Memory Limit: 256 MB
Submit: 819  Solved: 192
[ Submit][ Status][ Web Board]

Description

大家都知道回文数是正着读与反着读是一样的数,比如121,12321。

现在定义S是一个数的各个位数字的和,比如121 的和是4。

请你求出位数为5或6并且各位数字和为S的所有回文数字。

Input

第一行输入一个T 表示有T组样例(T<1000)。

接下来T行每行输入一个S(0

Output

对于每组样例,第一行输出Case x: 表示第x组样例

接下来输出符合条件的回文数,要求从小到大排序。如果没有符合条件的,请输出-1

Sample Input

24460

Sample Output

Case 1:99899499994589985598895679976688886697796769967778877787787796697859958868868877778886688895598949949958859967769976679985589994499Case 2:-1

HINT

Append Code

[ Submit][ Status][ Web Board]
这道题有点坑点,本菜鸡是打表干的,但是wa50%,后来直接暴力1到60才发现,里面有的没有-1,(wa思路:先找到不是0的位置,然后再顺次输出......)
这里举几个板栗:53,51,49,47。可以验一下。下面贴代码(应该对了......)
#include //回文打表
#include 
#include
int s[53][105];
int panduan(int i)
{
    int a;
    if(i/100000==0)a=5;
    else a=6;
    if(a==5)
    {
        if(i/10000!=i%10)return 0;
        if(i/10%10!=i%10000/1000)return 0;
    }
    else if(a==6)
    {
        if(i/100000!=i%10)return 0;//首位
        if(i/10000%10!=i/10%10)return 0;//第二位
        if(i/1000%10!=i/100%10)return 0;//第三位
    }
    return 1;
}
int dabiao(int n)
{
    memset(s,0,sizeof(s));
    int a=10001;
    int cnt=0,b,i,e;
    for(i=a; i<=999999; i++)
    {
        if(panduan(i)==0)continue;
        b=i;
        cnt=0;
        while(b!=0)
        {
            cnt+=b%10;
            b/=10;
        }
        for(e=0; s[cnt+2][e]!=0; e++);//找到不是0的位置
        s[cnt+2][e]=i;
    }
    return 0;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int n,n1;
    int a;
    dabiao(54);
    int i;
    scanf("%d",&n);
    for(n1=1; n1<=n; n1++)
    {
        printf("Case %d:\n",n1);
        scanf("%d",&a);
        if(a>54||a<2)
        {
            printf("-1\n");
            continue;
        }
        if(s[a+2][0]==0){
                printf("-1\n");
        continue;
        }
        for(i=0; s[a+2][i]!=0; i++)
        {
            printf("%d\n",s[a+2][i]);
        }
    }
    return 0;
}


你可能感兴趣的:(山科大oj)