标签:
#include<iostream>// chengdacaizi 注释
using namespace std;
long long key[35000]={0};//在dev中可以这么定义,代表64bits
int getDigit(int n)//计算位数的函数
{
int digit=1;
while(n/10)
{
n=n/10;
digit++;
}
return digit;
}
void init()//把每个数的位置存到数组里!
{
key[0]=0;
for(int i=1; i<35000; i++)
key[i]=key[i-1]+getDigit(i);
}
int main()//主函数
{
int t;
long long sum,n,i;
init();
scanf("%d",&t);
while(t--)
{
cin>>n;//输入位置n;
i=1,sum=0;
while(n>=sum+key[i])//计算在小于n 的情况下,前i-1段循环的位置总和;
{
sum=sum+key[i];
i++;
}
if(n==sum)
printf("%d\n",(i-1)%10);//如果 n 正好等于前 i-1 段的位置总和 那么最后一个
else //段的最后一个数就是所要求的那个数字
{
n=n-sum;
for(i=1; key[i]<=n; i++); //否则n将大于sum;可以想象是减去sum后多出来
n=n-key[i-1]; //一段;再用类似的方法,把前i段剪掉,保证 n 一定要
if(n!=0) //大于最后一段的位置; 剪下后剩下 最后的一小段;
{ //而n 所在的当前一段是1234...i;
int num=i; //现在n 的长度从左向右 长度小于i or num
n=getDigit(num)-n;//理解成从左到右的长度方向
for(i=1; i<=n; i++)
num=num/10;
printf("%d\n",num%10);
}
else
printf("%d\n",(i-1)%10);
}
}
system("pause");
return 0;
}
标签:
原文地址:http://www.cnblogs.com/gavinsp/p/4563221.html