• 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
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    【2020-02-02】禅修无处不在
    【2020-02-01】接受改变这个常态
    2 分法查找内容
    python 单例模式
    day 34 js 基础后部分 BOM 和 事件和正则
    第三次网编考试
    day 33js 后续 函数.对象
    爬虫 自动生成请求头教程
    请求数据分析 xpath语法 与lxml库
    sanic 计划学习这个
  • 原文地址:https://www.cnblogs.com/--560/p/4364070.html
Copyright © 2020-2023  润新知