POJ 1019 Number Sequence

来源:互联网 发布:柠檬网络电视tv免费版 编辑:程序博客网 时间:2024/06/18 10:50
Number Sequence
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 40208 Accepted: 11694

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

283

Sample Output

22
题意很容易理解
思路:将1 12 123 1234 。。。12345。。N分成n段分别记录他们的长度len【】和到这里的长度sum【】
注意  从10到99的数的长度为2  从100到999长度 为3//用到一个len【i】=len【i-1】+(int)log10((double)i)+1;
对于每一个数,例如8  我们可以找到他在 第4段 找到他在该段的位置 为2。
#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#define N 40000long long len[N],sum[N];void init(){for(int i=1;i<N;i++){len[i]=len[i-1]+(int)log10((double)i)+1;sum[i]=sum[i-1]+len[i];}}int doit(int x){int i,j;while(sum[i]<x){i++;}x-=sum[i-1];//下边的pos和x是不一样的
int llen=0;for(i=1;llen<x;i++){llen+=(int)log10((double)i)+1;}int pos=llen-x;//这里的pos和x不同因为10—99为2;return (i-1)/(int)pow((double)10,pos)%10;}int main(){init();/*for(int i=1;i<=100;i++){printf("%d %d\n",len[i],sum[i]);}*/int ccase;scanf("%d",&ccase);while(ccase--){int n;scanf("%d",&n);int ans=doit(n);printf("%d\n",ans);}return 0;}


原创粉丝点击