zoukankan      html  css  js  c++  java
  • 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!
  • 相关阅读:
    js截取字符串区分汉字字母代码
    List 去处自定义重复对象方法
    63. Unique Paths II
    62. Unique Paths
    388. Longest Absolute File Path
    41. First Missing Positive
    140. Word Break II
    139. Word Break
    239. Sliding Window Maximum
    5. Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/--560/p/4364070.html
Copyright © 2011-2022 走看看