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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
