POJ 1019 Number Sequence

// 11212312341234512345612345671234567812345678912345678910123456789101112345678910......
// 给你个n 求上面的序列第n个数字是多少
// 我是先按尾巴数字位数分组
// 定义如下数据结构
// 然后在求在确定位数里面的第几个
// 再求这个子序列里面的某一位
// 就是分组 归类的思想
// 1Y ,看来思路清晰,代码清晰对于准确率来说是满重要,以前老是迷迷糊糊就开始写代码
#include <iostream> #include <string> #include<sstream> #include <cmath> #include <map> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define LL long long /* 结束的数值 个数 长度范围 1 9 9 1 9 1位 10 99 90 11 189 2位 100 999 900 ..... 1000 9999 9000 ..... 10000 99999 90000 ..... */ struct node { int len; //位数 int num; //个数 LL l,r; //长度区间 LL sum; //长度和 }st[10]; int GetAns(int index,LL n) { LL x=st[index].l; while(n>x) { n-=x; x+=index; } int len[10],start[10],num[10]; len[1]=9;start[1]=1;num[1]=9; int i; for(i=2;i<=5;i++) { num[i]=num[i-1]*10; len[i]=i*num[i]; start[i]=start[i-1]*10; } i=1; while(n) { if(n>len[i]) { n-=len[i]; i++; } else break; } int k=start[i]+n/i; int stack[10],j; if(n%i==0) { k--; return k%10; } else { k++; i=n%i; j=0; while(k) { stack[j++]=k%10; k/=10; } while(i--) { j--; } return stack[j]; } } int main() { st[1].len=1;st[1].num=9; st[1].l=1;st[1].r=9; st[1].sum=(1+9)*9/2; int i; for(i=2;i<=5;i++) { st[i].len=i;st[i].num=st[i-1].num*10; st[i].l=st[i-1].r+i; st[i].r=st[i-1].r+i*st[i].num; st[i].sum=(st[i].l+st[i].r)*st[i].num/2; } // for(i=1;i<=5;i++) // printf("%d %d %lld %lld %lld ",st[i].len,st[i].num,st[i].l,st[i].r,st[i].sum); int t; LL n; scanf("%d",&t); while(t--) { scanf("%lld",&n); for(i=1;i<=5;i++) { if(n>st[i].sum) n-=st[i].sum; else break; } printf("%d ",GetAns(i,n)); } return 0; }
原文地址:https://www.cnblogs.com/372465774y/p/3603719.html