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

 

posted @ 2015-03-24 21:36  __560  阅读(284)  评论(0编辑  收藏  举报