Number Sequence
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 33439 | Accepted: 9559 |
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
For example, the first 80 digits of the sequence are as follows:
11212312341234512345612345671234567812345678912345678910123456789101112345678910
Input
8
3
Sample Output
2 2
Source
Tehran 2002, First Iran Nationwide Internet Programming Contest
链接:http://poj.org/problem?id=1019
【题意】数列:112123123412345123456123456712345678123456789123456789101234567891011123456789101112......
求第i位的数字
【思路】
1.打表。求出子数列1-数x(1,2,3...)包含数字的个数,求出整个数列1-数x(1,2,3...)包含数字的个数;
2.根据 i 求出i所在的子数列(1-x),再求出第i位所在的数y,再求出数字ans;
【代码】
#include<cstdio>
#include<iostream>
using namespace std;
long long dp[100000];//测出最大是31268
long long sum[100000];
int r;
int get(long long x)
{
int ans=0;
while(x)
{
++ans;
x=x/10;
}
return ans;
}
void innit()
{
int i;
dp[0]=0;
sum[0]=0;
for(int i=1;1;i++)
{
dp[i]=dp[i-1]+get(i);
sum[i]=sum[i-1]+dp[i];
//if(i==9||i==99||i==999||i==9999||i==99999||i==999999)
//cout<<sum[i]<<ends;
if(sum[i]>=2147483647)
{
r=i;
//cout<<r;
break;
}
}
}
int main()
{
innit();
int n,c;
scanf("%d",&c);
while(c--)
{
scanf("%d",&n);
int left=1,right=r;
while(left<right)
{
int mid=(left+right)/2;
if(sum[mid]<n)
left=mid+1;
else
right=mid;
}
n=n-sum[left-1];
right=left;
left=1;
while(left<right)
{
int mid=(left+right)/2;
if(dp[mid]<n)
left=mid+1;
else
right=mid;
}
n=n-dp[left-1];
int num[10],lenth=dp[left]-dp[left-1];
for(int i=1;i<=lenth;i++)
{
num[lenth-i+1]=left%10;
left=left/10;
}
cout<<num[n]<<endl;
}
return 0;
}