题目大意:
一个数字序列S1S2…Sk.每个组Sk包含从1到k的正整数。前80个数字是
11212312341234512345612345671234567812345678912345678910123456789101112345678910
现在给出一个数字i,输出位置i的数字
题目大意:
慢慢逼近结果,提高查询效率
代码如下:
#include<iostream>
using namespace std;
int a[4]={9,180,2700,36000};
int Power(int i,int j)
{
int total=1;
for(int k=1;k<=j;k++)
{
total*=i;
}
return total;
}
int Find(int dig)
{
int i;
for(i=0;i<4;i++)
{
if(dig<=a[i]) break;
dig-=a[i];
}
int number=dig/(i+1);
int place=dig%(i+1);
if(place==0)
{
number+=Power(10,i)-1;
return number%10;
}
else
{
number+=Power(10,i);
int count=i+1-place+1;
while(count>1)
{
number/=10;
count--;
}
return number%10;
}
}
int Find(int*nums,int n,int dig)
{
int i=0;
for(i=0;i<n;i++)
{
if(dig<=nums[i]) break;
dig-=nums[i];
}
return Find(dig);
}
int main()
{
int *nums=new int[32000];
nums[0]=1;
double total=nums[0];
for(int i=1;i<32000;i++)
{
if(total>=2147483647) break;
if(i<=9-1)
{
nums[i]=nums[i-1]+1;
}
else
{
if(i<=9+90-1)
{
nums[i]=nums[i-1]+2;
}
else
{
if(i<=9+90+900-1)
{
nums[i]=nums[i-1]+3;
}
else
{
if(i<=9+90+900+9000-1)
{
nums[i]=nums[i-1]+4;
}
else
{
nums[i]=nums[i-1]+5;
}
}
}
}
total+=nums[i];
}
int t,dig;
cin>>t;
while(t>0)
{
cin>>dig;
cout<<Find(nums,32000,dig)<<endl;
t--;
}
return 0;
}
898

被折叠的 条评论
为什么被折叠?



