ACM PKU 1019 Number Sequence http://acm.pku.edu.cn/JudgeOnline/problem?id=1019

#include <iostream>
#include <cmath>
using namespace std;

int Len(int n)   // 求数字的长度函数;
{
    return log10(double(n)) + 1;
}

int oj (int i, int temp)   //一个比较傻的打表;不为别的,就选择最省时的;
{
if (temp < 10) return temp;
if (temp < 100)
{
   if (i == 1) return temp/10;
   else return temp%10;
}
if (temp < 1000)
{
   if (i == 3) return temp%10;
   if (i == 2) return (temp/10)%10;
   if (i == 1) return (temp/100);
}
if (temp < 10000)
{
   if (i == 4) return temp%10;
   if (i == 3) return (temp/10)%10;
   if (i == 2) return (temp/100)%10;
   if (i == 1) return (temp/1000);
}
if (temp < 100000)
{
   if (i == 5) return temp%10;
   if (i == 4) return (temp/10)%10;
   if (i == 3) return (temp/100)%10;
   if (i == 2) return (temp/1000)%10;
   if (i == 1) return (temp/10000); 
}
if (temp < 1000000)
{
   if (i == 6) return temp%10;
   if (i == 5) return (temp/10)%10;
   if (i == 4) return (temp/100)%10;
   if (i == 3) return (temp/1000)%10;
   if (i == 2) return (temp/10000)%10; 
   if (i == 1) return (temp/100000); 
}
return 0;
}

int research(int i)
{
__int64 sum = 0;   //这个数非常大,引用的__int64;也是第一次用;
int temp = 1; 
int j = 0;
int len = 0;
while (sum < i)    //第一轮查找,找该数所在的串系列;
{
   // len = 0;
   // for (int m = 1; m <= temp; m++)本来是要去这样做的,结果发现len 可以保留,就直接拿来用了,效果不错;
   len+=Len(temp);
   sum+=len;
   temp++;
}
if (sum == i)
{
   temp = temp - 1;
   int turn = temp - (temp/10)*10;
   return turn;
}
else
{
   sum =sum - len;
   temp = 0;
   for (j = sum ; sum < i ; )   //第二轮查找,找到要找位的前一个数字;
   {
    temp++; 
    sum +=Len(temp); 
   }
   if (sum == i) return temp%10;
   else
   {
    sum -=Len(temp);
    i = i - sum;
    return oj(i,temp);    //第三轮查找;确定最终位置的数字;
   }
} 
}

int main ()
{
int n ;
cin >> n;
while (n--)
{
   int num;
   cin >> num;
   cout<<research(num)<<endl;
}
return 0;
}

posted on 2011-05-06 18:55  _Clarence  阅读(94)  评论(0编辑  收藏  举报

导航