poj1019——log10求位数
Number Sequence
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 35084 | Accepted: 10099 |
Description
A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2...Sk. Each group Sk consists of a sequence of positive integer numbers ranging from 1 to k, written one after another.
For example, the first 80 digits of the sequence are as follows:
11212312341234512345612345671234567812345678912345678910123456789101112345678910
For example, the first 80 digits of the sequence are as follows:
11212312341234512345612345671234567812345678912345678910123456789101112345678910
Input
The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by one line for each test case. The line for a test case contains the single integer i (1 ≤ i ≤ 2147483647)
Output
There should be one output line per test case containing the digit located in the position i.
Sample Input
2 8 3
Sample Output
2 2
题意:求数串112123123412345..第n位的数字(0-9)
思路:取将每一个123..的位数存起来,利用取对数求位数公式:(int)log10(n*1.0)+1,先二分找出n所在的那个串的位数, n-=其前缀,再找到第n位即可
庆祝一下,程序完全是自己调试出来的,从WA到AC,这次终于没有借助题解了
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef unsigned long long ull; const int maxn=10001000; const ull INF=21474836470; int T; int n; ull a[maxn],s[maxn]; int cnt=1; int tag=1; ull mypow(int n,int k) { ull res=1; while(k--) res*=n; return res; } ull BinSearch(ull *a,int left,int right,int key) { while(left<right){ int mid=(left+right)/2; if(a[mid]>=key&&a[mid-1]<key) return mid; if(a[mid]>=key) right=mid; else left=mid+1; //cout<<tag++<<endl; } return 0; } int search(int n) { ull key=BinSearch(s,1,cnt-1,n);///查找第一个比n大的数d的下标 //cout<<"key="<<key<<endl; n-=s[key-1]; for(int i=1;i<=key;i++){ int t=(int)log10(i*1.0)+1; if(n-t<=0){ //cout<<"n="<<n<<" "<<"t="<<t<<endl; int res=0; while(n--){ int a=mypow(10,--t); res=i/a; i%=a; } return res; } n-=t; } } void playlist() { a[0]=s[0]=0; ull sum=0; for(int i=1;i<maxn;i++){ a[i]=a[i-1]+(int)log10(i*1.0)+1; s[i]=a[i]+s[i-1]; cnt=i; if(s[i]>INF||s[i]<=0) break; } //for(int i=1;i<50;i++) cout<<i<<" "<<a[i]<<" "<<s[i]<<endl; } void debug() { for(int i=1;i<=100;i++) cout<<search(i); cout<<endl; } int main() { playlist(); //debug(); cin>>T; while(T--){ cin>>n; //cout<<"ans="<<search(n)<<endl; cout<<search(n)<<endl; } return 0; }