POJ2402+模拟
题意:找出第index 个回文数。
这题是有规律的,即list[]数组。
其次,对于某个 index 可以先精确到 位数 pos,然后在进行分析。
1a
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 typedef __int64 int64; 5 int64 list[ 24 ]; 6 int ans[ 240 ]; 7 8 void init(){ 9 list[0] = 0; 10 list[1] = 9; 11 list[2] = 9; 12 list[3] = 90; 13 list[4] = 90; 14 list[5] = 900; 15 list[6] = 900; 16 list[7] = 9000; 17 list[8] = 9000; 18 list[9] = 90000; 19 list[10] = 90000; 20 list[11] = 900000; 21 list[12] = 900000; 22 list[13] = 9000000; 23 list[14] = 9000000; 24 list[15] = 90000000; 25 list[16] = 90000000; 26 list[17] = 900000000; 27 list[18] = 900000000; 28 list[19] = 9000000000; 29 list[20] = 9000000000; 30 //printf("list20=%I64d\n",list[20]); 31 } 32 int main(){ 33 int64 index; 34 init(); 35 while( scanf("%I64d",&index),index ){ 36 int pos; 37 for( int num=0;num<=20;num++ ){ 38 if( index>=list[ num ] ){ 39 index -= list[ num ]; 40 pos = num; 41 } 42 else 43 break; 44 } 45 if( index>0 ) pos ++; 46 //printf("pos=%d\n",pos); 47 if( index==0 ){ 48 for( int i=0;i<pos;i++ ) 49 printf("9"); 50 printf("\n"); 51 continue; 52 } 53 int64 cur = list[ pos ]/9; 54 if( index>=cur ){ 55 index += cur; 56 index --; 57 int tt=0; 58 while( index!=0 ){ 59 ans[ tt++ ] = index%10; 60 index /= 10; 61 } 62 if( pos%2==0 ){ 63 for( int i=tt-1;i>=0;i-- ) 64 printf("%d",ans[i]); 65 for( int i=0;i<tt;i++ ) 66 printf("%d",ans[i]); 67 printf("\n"); 68 }//偶数位 69 else{ 70 for( int i=tt-1;i>=0;i-- ) 71 printf("%d",ans[i]); 72 for( int i=1;i<tt;i++ ) 73 printf("%d",ans[i]); 74 printf("\n"); 75 }//奇数位 76 } 77 else{ 78 index--; 79 int num1 = 0; 80 int num2 = 0; 81 while( cur!=0 ){ 82 num1++; 83 cur /= 10; 84 } 85 int tt = index; 86 while( tt!=0 ){ 87 num2++; 88 tt /= 10; 89 } 90 tt = 0; 91 while( index!=0 ){ 92 ans[tt++] = index%10; 93 index/=10; 94 } 95 for( int i=1;i<=num1-num2;i++ ) 96 if( i==num1-num2 ) 97 ans[tt++] = 1; 98 else 99 ans[tt++] = 0; 100 if( pos%2==0 ){ 101 for( int i=tt-1;i>=0;i-- ) 102 printf("%d",ans[i]); 103 for( int i=0;i<tt;i++ ) 104 printf("%d",ans[i]); 105 printf("\n"); 106 } 107 else{ 108 for( int i=tt-1;i>=0;i-- ) 109 printf("%d",ans[i]); 110 for( int i=1;i<tt;i++ ) 111 printf("%d",ans[i]); 112 printf("\n"); 113 } 114 } 115 } 116 return 0; 117 }
keep moving...