Number Sequence POJ - 1019 遞推 數學
阿新 • • 發佈:2019-01-14
題意 1 12 123 1234 12345 ....這樣的序列 問第n位數字是幾 是數字! 1-9!
思路:遞推關係 主要是位數的計算 用a[i]=a[i-1]+(int)log10((double)i)+1; 每加一個n位數 加log10(n)+1位
還有取數字 (i-1)/(int)pow((double)10,len-pos)%10 len-pos 是到最後有多少位 數字/10^(len-pos) 就把後面幾位截斷了再%10就能取出要的數字了
參考:https://blog.csdn.net/lyy289065406/article/details/6648504
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 using namespace std; 7 const int maxn=31269+100; 8 typedef long long ll; 9 ll p[maxn]; 10 ll sum[maxn];11 void init(){ 12 p[1]=1; 13 sum[1]=1; 14 for(int i=2;i<maxn;i++){ 15 p[i]=p[i-1]+1+(int)log10(double(i)); 16 sum[i]=sum[i-1]+p[i]; 17 } 18 } 19 int find(ll n){ 20 int temp=lower_bound(sum+1,sum+maxn,n)-sum; 21 int pos=n-sum[temp-1]; 22 int len=0; 23 inti; 24 for( i=1;len<pos;i++){ 25 len+=1+int(log10(i*1.0)); 26 } 27 return (i-1)/(int)pow(10.0,len-pos)%10; 28 } 29 int main(){ 30 ll n; 31 init(); 32 int t; 33 scanf("%d",&t); 34 while(t--){ 35 scanf("%lld",&n); 36 printf("%d\n",find(n)); 37 } 38 return 0; 39 }