http://poj.org/problem?id=1019
題意:1 12 123 1234 12345 一竄數(shù)字 求第n位的數(shù)字是什么
分析:拿到題就是不會(huì)。。。
? ? ? ? ?看了題解
? ? ? ? ?a[i]計(jì)算i數(shù)字的位數(shù),s[i]計(jì)算到達(dá)i數(shù)字的總位數(shù)
? ? ? ? ?i數(shù)字的位數(shù)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個(gè)數(shù)字的位數(shù)和是大于n的 pos =n-s[i- 1 ]; // 計(jì)算出n位是第i個(gè)數(shù)字的第幾位 int len= 0 ; for (i= 1 ;len<pos;i++) // 找出那個(gè)數(shù)字i len+=( int )log10(( double )i)+ 1 ; return (i- 1 )/( int )pow( 10.0 ,len-pos)% 10 ; // i-1是上一個(gè)循環(huán)i多加了一次,len-pos是‘ // 所求位數(shù)字的后面那幾位要除掉,在%10就是所求位的數(shù)字了 } // 例如5 s[3]=112123,pos=5-s[2]=2;循環(huán)中所能找到的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 ; }
?
? ??
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
