http://poj.org/problem?id=1019
题意:1 12 123 1234 12345 一窜数字 求第n位的数字是什么
分析:拿到题就是不会。。。
看了题解
a[i]计算i数字的位数,s[i]计算到达i数字的总位数
i数字的位数log10(i)+1
#include<stdio.h> #include <math.h> const int MAXN= 40000 ; long long a[MAXN]; long long s[MAXN]; void init() { s[ 1 ]=a[ 1 ]= 1 ; for ( int i= 2 ;i<MAXN;i++ ) { a[i] =a[i- 1 ]+( int )log10(( double )i)+ 1 ; s[i] =s[i- 1 ]+ a[i]; } } int compute( int n) { int pos,i= 1 ; while (s[i]<n) i++; // 找出第i个数字的位数和是大于n的 pos =n-s[i- 1 ]; // 计算出n位是第i个数字的第几位 int len= 0 ; for (i= 1 ;len<pos;i++) // 找出那个数字i len+=( int )log10(( double )i)+ 1 ; return (i- 1 )/( int )pow( 10.0 ,len-pos)% 10 ; // i-1是上一个循环i多加了一次,len-pos是‘ // 所求位数字的后面那几位要除掉,在%10就是所求位的数字了 } // 例如5 s[3]=112123,pos=5-s[2]=2;循环中所能找到的len=3,i=3; 2/1%10=2; int main() { int T,n; init(); scanf( " %d " ,& T); while (T-- ) { scanf( " %d " ,& n); printf( " %d\n " ,compute(n)); } return 0 ; }