poj1019——log10求位数

poj1019——log10求位数

Number Sequence
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 35084   Accepted: 10099

Description

A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2...Sk. Each group Sk consists of a sequence of positive integer numbers ranging from 1 to k, written one after another. 
For example, the first 80 digits of the sequence are as follows: 
11212312341234512345612345671234567812345678912345678910123456789101112345678910

Input

The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by one line for each test case. The line for a test case contains the single integer i (1 ≤ i ≤ 2147483647)

Output

There should be one output line per test case containing the digit located in the position i.

Sample Input

2

8

3

Sample Output

2

2
题意:求数串112123123412345..第n位的数字(0-9)
思路:取将每一个123..的位数存起来,利用取对数求位数公式:(int)log10(n*1.0)+1,先二分找出n所在的那个串的位数, n-=其前缀,再找到第n位即可
庆祝一下,程序完全是自己调试出来的,从WA到AC,这次终于没有借助题解了
#include<iostream>

#include<cstdio>

#include<cstring>

#include<cstdlib>

#include<algorithm>

#include<cmath>



using namespace std;



typedef unsigned long long ull;

const int maxn=10001000;

const ull INF=21474836470;



int T;

int n;

ull a[maxn],s[maxn];

int cnt=1;

int tag=1;



ull mypow(int n,int k)

{

    ull res=1;

    while(k--) res*=n;

    return res;

}



ull BinSearch(ull *a,int left,int right,int key)

{

    while(left<right){

        int mid=(left+right)/2;

        if(a[mid]>=key&&a[mid-1]<key) return mid;

        if(a[mid]>=key) right=mid;

        else left=mid+1;

        //cout<<tag++<<endl;

    }

    return 0;

}



int search(int n)

{

    ull key=BinSearch(s,1,cnt-1,n);///查找第一个比n大的数d的下标

    //cout<<"key="<<key<<endl;

    n-=s[key-1];

    for(int i=1;i<=key;i++){

        int t=(int)log10(i*1.0)+1;

        if(n-t<=0){

            //cout<<"n="<<n<<" "<<"t="<<t<<endl;

            int res=0;

            while(n--){

                int a=mypow(10,--t);

                res=i/a;

                i%=a;

            }

            return res;

        }

        n-=t;

    }

}



void playlist()

{

    a[0]=s[0]=0;

    ull sum=0;

    for(int i=1;i<maxn;i++){

        a[i]=a[i-1]+(int)log10(i*1.0)+1;

        s[i]=a[i]+s[i-1];

        cnt=i;

        if(s[i]>INF||s[i]<=0) break;

    }

    //for(int i=1;i<50;i++) cout<<i<<" "<<a[i]<<" "<<s[i]<<endl;

}



void debug()

{

    for(int i=1;i<=100;i++) cout<<search(i);

    cout<<endl;

}



int main()

{

    playlist();

    //debug();

    cin>>T;

    while(T--){

        cin>>n;

        //cout<<"ans="<<search(n)<<endl;

        cout<<search(n)<<endl;

    }

    return 0;

}
View Code

 

你可能感兴趣的:(poj)