poj 1019 Number Sequence 数学
2016-08-01 18:46
411 查看
题意:
给你这一串数字
11212312341234512345612345671234567812345678912345678910123456789101112345678910……
要我们求出第n个数是多少(从左到右看),例如第2个是1,第三个是2,第八个是2;
分析:
log10(x)+1求的是一个数的位数。然后可以这样求出第i个数的位数,a[i]统计到第i个数一共有几个数,即从1到i的每一段有几位数。s[i]统计到i这个数总共的位数。然后对于查找第x位,先在s数组中找到第几段(假设是k),找到在这一段中的位置pos,然后就计算这个位置是哪个数就行了。
查找的时候可以用二分,不过遍历就足够了。
给你这一串数字
11212312341234512345612345671234567812345678912345678910123456789101112345678910……
要我们求出第n个数是多少(从左到右看),例如第2个是1,第三个是2,第八个是2;
分析:
log10(x)+1求的是一个数的位数。然后可以这样求出第i个数的位数,a[i]统计到第i个数一共有几个数,即从1到i的每一段有几位数。s[i]统计到i这个数总共的位数。然后对于查找第x位,先在s数组中找到第几段(假设是k),找到在这一段中的位置pos,然后就计算这个位置是哪个数就行了。
查找的时候可以用二分,不过遍历就足够了。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; typedef long long ll; const int N=31270; ll a ,s ; void init() { a[1]=s[1]=1; for(int i=2;i<N;i++){ a[i]=a[i-1]+(ll)log10((double)i)+1; s[i]=s[i-1]+a[i]; } } int main() { //freopen("f.txt","r",stdin); init(); int T;scanf("%d",&T); while(T--){ ll n; scanf("%lld",&n); int t=1; while(s[t]<n)t++; int pos=n-s[t-1]; int i,x=0; for(i=1;x<pos;i++){ x+=(int)log10((double)i)+1; } printf("%d\n",(i-1)/(int)pow(10.0,x-pos)%10); } return 0; }
相关文章推荐
- POJ 1019 Number Sequence (数学+预处理 循环递增序列第k位数字)
- POJ1019 ZOJ1410 UVA10706 Number Sequence【数学】
- poj 1019 Number Sequence 【组合数学+数字x的位宽函数】
- [poj 1019] Number Sequence 数学 想法题
- poj1019 Number Sequence 二分+数学+打表
- POJ 1019 Number Sequence(组合数学)
- poj_1019 Number Sequence(数学)
- POJ-1019 Number Sequence 数学
- poj 1019 Number Sequence 数学&模拟
- POJ-1019-Number Sequence-组合数学
- poj 1019 Number Sequence 第i位上的数字 (组合数学)
- poj1019——Number Sequence(数学)
- POj 1019 number sequence(数学)
- poj 1019 Number Sequence (组合数学)
- POJ1019 ZOJ1410 UVA10706 Number Sequence【数学】
- poj 1019 Number Sequence
- poj 1019 Number Sequence
- poj 1019 Number Sequence
- POJ 1019 Number Sequence 转载
- POJ 1019 Number Sequence