zoukankan      html  css  js  c++  java
  • POJ 1019 Number Sequence【数论】

    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

    题目大意:比较容易理解就是找出第i位的数字是多少;
    思路:

    很容易看出题目给的规律,1 112 112123 1121231234 112123123412345....题目给出第i位的数字,i的范围恰好是int的范围,可以算出不会超过40000组;
    用a[i]表示i组数的位数:a[i]=a[i-1]+(int)(log10(i*1.0))+1; num[i]表示前i组数的位数和num[i]=num[i-1]+a[[i];
    举例:假若求54321的第2位的数字,即54321/(pow(10, 5-2))%10;即将多余的位数去掉:n/(pow(10, 多余位数),在对10取模得打结果;

    关于精度问题解题思路没有精确说明;

    代码如下:

    View Code
    #include<stdio.h>
    #include<string.h>
    #include<math.h> 
    long long a[40005], num[40005]; 
    int main()
    {
        int T, i;
        long long n; 
        scanf("%d", &T);
        memset(a, 0, sizeof(a));
        memset(num, 0, sizeof(num)); 
        for(i=1; i<=40000; i++)
        {
            a[i]=(long long)(log10(i*1.0))+1+a[i-1];
            num[i]=num[i-1]+a[i];
        }
        while(T--)
        {
            scanf("%lld", &n);
            for(i=0; i<40000; i++)
                if(n>num[i]&&n<=num[i+1])
                    break; 
            int pos=n-num[i];
            int length=0;
            for(i=1; length<pos; i++)
                length+=(int)(log10(i*1.0))+1; 
            int mod=(i-1)/((int)(pow(10.0, length-pos)))%10;
            printf("%d\n", mod); 
        }
    }
  • 相关阅读:
    8.10
    今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?
    Gym 100500B Conference Room(最小表示法,哈希)
    CodeForces 438D The Child and Sequence(线段树)
    UVALIVE 6905 Two Yachts(最小费用最大流)
    Gym Conference Room (最小表示法,哈希)
    hdu 2389 Rain on your Parade(二分图HK算法)
    Codeforces Fox And Dinner(最大流)
    zoj 3367 Counterfeit Money(dp)
    ZOJ3370. Radio Waves(2-sat)
  • 原文地址:https://www.cnblogs.com/Hilda/p/2644739.html
Copyright © 2011-2022 走看看