Number Sequence(poj 1019)
题意:
有一串数字串,其规律为
1 12 123 1234 12345 123456 1234567 12345678 123456789 12345678910 1234567891011 123456789101112······k
输入位置n,计算这一串数字第n位是什么数字,注意是数字,不是数!
例如12345678910的第10位是1,而不是10,第11位是0,也不是10。总之多位的数在序列中要被拆分为几位数字,一个数字对应一位。
//运用了一个公式:求一个数的位数时,可以用 (int)log10((double)i)+1 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #define LL long long #define M 100010 int num[M],b[M];//num[i]表示第i个数串的长度 using namespace std; void init() { for(int i=1;i<=100000;i++) num[i]=num[i-1]+(int)log10((double)i)+1; } int main() { init();//打表 int T; cin>>T; while(T--) { int n;LL length=0; cin>>n; for(int i=1;i<=100000;i++) if(length+(LL)num[i]<n) length+=(LL)num[i]; else break;//找到所在数串 int p=0; for(int i=1;i<=100000;i++) { int tmp=(int)log10((double)i)+1; if(length+(LL)tmp<n) length+=(LL)tmp; else { p=i; break;//找到所在整数 } } memset(b,0,sizeof(b)); int s=n-length,cnt=(int)log10((double)p)+1; while(cnt)//将所在整数分解 { b[cnt--]=p%10; p/=10; } cout<<b[s]<<endl; } return 0; }