Number Sequence
Time Limit: 1000MS Memory Limit: 10000K
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 Source Tehran 2002, First Iran Nationwide Internet Programming Contest
问题是给定t个检验数据,每个数据i表示在“数字串”中的索引位置,需要根据给定i值输出在第i个位置的数字。
已知信息:
“数字串”的构成方式——有一些有序的“数字组”构成,而每一“数字组”是有前一个“数字组”与当前“数字组”的索引位置构成;
数字串长应该大于等于0,且不小于2147483647;
输入t表示测试数据组,i表示索引位置。
我的求解:
一开始很容易有这样一个思路:把这个“数字串”用string的数据类型表示出来,然后直接访问string的i-1位置。但是,这佯做将使程序严重超时。
我的做法是这样的:先求解出该索引值属于哪个“数字组”中,然后从这一数字组中搜索结果。代码如下:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
string intToStr( int i )
{
string s="";
while( i>=10 )
{
int t = i%10;
s = (char)(t+'0')+s;
i = i/10;
}
s = (char)(i+'0')+s;
return s;
}
// 搜索索引index落在“哪个数”中, 并找出第index项的数字
void search( long index )
{
string temp;
int i,j;
unsigned long sum=0,item=0; // sum 字符串总长度 item 每一项的长度
for( i=1; i<=31500; i++ )
{
temp = intToStr(i);
item += temp.length();
sum +=item;
if( sum >= index )
break;
}
long distance = item - ( sum - index );
/// 搜索并输出结果
int len=0;
for( j=1; j<=i; j++ )
{
temp = intToStr(j);
len += temp.length();
if( len >= distance )
{
int m =temp.length()- (len-distance)-1;
cout<<temp[m]<<endl;
break;
}
}
}
int main()
{
// ifstream cin("test.txt");
int i;
int n;
long index;
cin>>n;
for( i=0; i<n; i++ )
{
cin>>index;
search( index );
}
return 0;
}