*寒假水116——Number Sequence

 

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

 

#include<iostream>
#include<algorithm>  
#include<cstdio>  
#define LL long long  

using namespace std;  

const int maxn= 50001;  
const LL UP = 2.2e9;  
LL num[maxn], sum[maxn];  
int cnt,xin[15];  

inline void init()  
{  
    LL up = 0, pre = 0, x = 0, cut = 0; cnt = 0;  
    int flag = 0;  
    for(int k = 1; k <= 9; ++k)  
    {  
        cut = x;  
        x = x*10+9;  
        LL xx = x-cut;  
        for(int i = 1; i <= xx; ++i)  
        {  
            up += pre+i*k;  
            num[++cnt] = pre+i*k;  
            if(up >= UP){flag = 1; break;}  
        }  
        if(flag) break;  
        pre += (x-x/10)*k;  
    }  
    sum[0] = 0; sum[1] = num[1];  
    for(int i = 1; i <= cnt; ++i) sum[i] = sum[i-1]+num[i];  
}  

int main()  
{  
    init();  
    int t, n, k, flag;  
    scanf("%d", &t);  
    while(t--)  
    {  
        cin>>n;  
        for(k = 1; k <= cnt; ++k)  
        if(n <= sum[k]) break;  
        n -= sum[k-1]; flag = 0;  
        for(int i = 1; i <= k; ++i)  
        {  
            int t = i, j = 0;  
            while(t)  
            {  
               xin[++j] = t%10;  
                t /= 10;  
            }  
            for(int l = j; l >= 1; --l)  
            {  
                --n;  
                if(n == 0)  
                {  
                    flag = 1;  
                    cout<<xin[l]<<endl;  
                    break;  
                }  
            }  
            if(flag) break;  
        }  
    }  
    return 0;  
}  

题解:大字串是1 12 123 1234 12345……所以可以先把大字串分成小字串,再寻找具体位置上是几。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值