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
;
}

