POJ2402+模拟

来源:互联网 发布:淘宝客服挂起 编辑:程序博客网 时间:2024/05/16 13:41

题意:找出第index 个回文数。

这题是有规律的,即list[]数组。

其次,对于某个 index 可以先精确到 位数 pos,然后在进行分析。

#include<stdio.h>#include<string.h>#include<math.h>typedef __int64 int64;int64 list[ 24 ];int ans[ 240 ];void init(){    list[0] = 0;    list[1] = 9;    list[2] = 9;    list[3] = 90;    list[4] = 90;    list[5] = 900;    list[6] = 900;    list[7] = 9000;    list[8] = 9000;    list[9] = 90000;    list[10] = 90000;    list[11] = 900000;    list[12] = 900000;    list[13] = 9000000;    list[14] = 9000000;    list[15] = 90000000;    list[16] = 90000000;    list[17] = 900000000;    list[18] = 900000000;    list[19] = 9000000000;    list[20] = 9000000000;    //printf("list20=%I64d\n",list[20]);}int main(){    int64 index;    init();    while( scanf("%I64d",&index),index ){        int pos;        for( int num=0;num<=20;num++ ){            if( index>=list[ num ] ){                index -= list[ num ];                pos = num;            }            else                break;        }        if( index>0 ) pos ++;        //printf("pos=%d\n",pos);        if( index==0 ){            for( int i=0;i<pos;i++ )                printf("9");            printf("\n");            continue;        }        int64 cur = list[ pos ]/9;        if( index>=cur ){            index += cur;            index --;            int tt=0;            while( index!=0 ){                ans[ tt++ ] = index%10;                index /= 10;            }            if( pos%2==0 ){                for( int i=tt-1;i>=0;i-- )                    printf("%d",ans[i]);                for( int i=0;i<tt;i++ )                    printf("%d",ans[i]);                printf("\n");            }//偶数位            else{                for( int i=tt-1;i>=0;i-- )                    printf("%d",ans[i]);                for( int i=1;i<tt;i++ )                    printf("%d",ans[i]);                printf("\n");            }//奇数位        }        else{            index--;            int num1 = 0;            int num2 = 0;            while( cur!=0 ){                num1++;                cur /= 10;            }            int tt = index;            while( tt!=0 ){                num2++;                tt /= 10;            }            tt = 0;            while( index!=0 ){                ans[tt++] = index%10;                index/=10;            }            for( int i=1;i<=num1-num2;i++ )                if( i==num1-num2 )                    ans[tt++] = 1;                else                    ans[tt++] = 0;            if( pos%2==0 ){                for( int i=tt-1;i>=0;i-- )                    printf("%d",ans[i]);                for( int i=0;i<tt;i++ )                    printf("%d",ans[i]);                printf("\n");            }            else{                for( int i=tt-1;i>=0;i-- )                    printf("%d",ans[i]);                for( int i=1;i<tt;i++ )                    printf("%d",ans[i]);                printf("\n");            }        }    }    return 0;}


原创粉丝点击