题目链接:http://poj.org/problem?id=1019点击打开链接
Number Sequence
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 40327 | Accepted: 11722 |
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
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
模拟 用string做的 有点麻烦
#include <iostream>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <stack>
#include <limits>
#include <string>
#include <string.h>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
using namespace std;
long long int s[100000];
long long int ss[100000];
string sss,sssmid;
int main()
{
s[0]=0;
ss[0]=0;
s[1]=1;
ss[1]=1;
memset(s,0,sizeof(s));
memset(ss,0,sizeof(ss));
for(long long int i=1;i<50000-1;i++)
{
long long int mid=i;
long long int num=0;
while(mid)
{
mid/=10;
num++;
}
ss[i]=ss[i-1]+num;
s[i]=s[i-1]+ss[i];
mid=i;
string sssmid;
string ssmid;
while(mid)
{
int mmid=mid%10;
sssmid+=mmid+'0';
mid/=10;
}
for(int ii=sssmid.length()-1;ii>=0;ii--)
ssmid+=sssmid[ii];
//cout << ssmid << endl;
sss+=ssmid;
//cout << sss << endl;
//getchar();
}
// for(int i=1;i<11;i++)
// {
// printf("%lld\n",ss[i]);
// }
int n;
scanf("%d",&n);
// for(int i=1;i<=10;i++)
// cout << s[i] << endl;
for(int i=1;i<=n;i++)
{
long long int mid;
scanf("%lld",&mid);
int mid1,mid2;
for(int i=1;i<50000;i++)
if(s[i]<=mid&&s[i+1]>mid)
{
if(mid-s[i]==0)
{
printf("%d\n",i%10);
}
else
{
printf("%c\n",sss[mid-s[i]-1]);
}
break;
}
//mid2=lower_bound(s.begin(),s.end(),mid)-s.begin();
}
}