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
;
}
?
? ??
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

