题目不说了,在PKU的ACM上。
我的思想是先找到loc在S(K)上,首先要求得K是多少。函数fun干的就是这个事情...
int fun(long long loc)
{
int i = 1; // i就是第i个序列
while (loc > 0)
{
loc = loc - digit(i);
i++;
}
i--;
loc = loc + digit(i);
return output(loc,i);
}
loc = loc - digit(i)就是每次减去S(i)序列的长度
最后loc为负时就意味着找到的loc所在的S(k)了,此时k=i - 1;
output函数就是找出loc在S(k)序列离的数字
完整程序如下:
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
int lenOfi(int i)
{
int len = 1;
while (i / 10 != 0)
{
len ++;
i = i / 10;
}
return len;
}
long digit(int i)
{
int len = lenOfi(i);
long res = 0;
int k;
for (k = 0; k < len - 1; k++)
{
res += 9 * (long)pow(float(10),k) * (k + 1);
}
res += (i - ((long)pow(float(10),k) - 1)) * (k + 1);
return res;
}
int output(int loc,int k)
{
int m = 1;
int i = 1;
while (i < loc)
{
m++;
i = i + lenOfi(m);
}
int locInNum = i - loc;
for (i = 0; i < locInNum; i++)
{
m = m / 10;
}
return m % 10;
}
int fun(long long loc)
{
int i = 1; // i就是第i个序列
while (loc > 0)
{
loc = loc - digit(i);
i++;
}
i--;
loc = loc + digit(i);
return output(loc,i);
}
int main()
{
long long loc;
int len;
cin >> len;
int i;
for (i = 0; i < len; i++)
{
cin >> loc;
cout << fun(loc) << endl;
}
return 0;
}
Memory: 288K
Time: 32MS
感觉不是很完美,希望大家给点好的建议