回文数
回文数
| Time Limit: 1000MS | Memory Limit: 65535KB |
| Submissions: 70 | Accepted: 12 |
Sample Input
24
Sample Output
151
解析:
这道题是找第i小的回文数,首先看一下回文数不同位数所对应的不同个数:
1~9:9个;11~99:9个;101~999:9X10个;1001~9999:9X10个;10001~99999:9X10X10个······
可见位数和个数存在很强的规律性,也就说可以根据i的值确定其的位数,那么在确定其值,这样就容易多了,代码如下:
# include<stdio.h> int main() { long long num,add,sign; int odd,len,i; int str[1005]; scanf("%lld",&num); if(num<=9) printf("%lld\n",num); else { add=0; odd=0; sign=9; while(add<num)//利用规律 { odd+=2; add+=2*sign; sign*=10; } sign/=10; add-=sign; odd--; if(add<num)//精确得到位数odd,以及该位数前有多少回文数add odd++; else add-=sign; num-=add+1; len=(odd-1)/2; for(i=len;i>=0;i--) { str[i]=num%10;//得到中间的数值 str[odd-i-1]=num%10;//依次用同样的方法确定其他位置的数值 num/=10; } str[0]++;//首位和末尾是从1开始,不是从0开始的,就得都加1 str[odd-1]++; for(i=0;i<odd;i++) printf("%d",str[i]); printf("\n"); } return 0; }
浙公网安备 33010602011771号