1 #include <cstdio> 2 #include <cstring> 3 4 using namespace std; 5 6 int sum[20]; 7 //sum[i]表示尾数为i的组最大可达到的数字个数 8 void init() 9 { 10 sum[0] = 0; 11 sum[1] = 9; 12 sum[2] = 189; 13 sum[3] = 2889; 14 sum[4] = 38889; 15 sum[5] = 488889; 16 sum[6] = 5888889; 17 } 18 19 //找到最后对应的组数属于的范围是在多少位的整数上,返回整数的位数 20 int get_bit(int &n) 21 { 22 for(int i = 0 ; i<6 ; i++){ 23 if(n > sum[i] && n <= sum[i+1]) 24 { 25 n -= sum[i]; 26 return i+1; 27 } 28 } 29 return -1; 30 } 31 //返回g这个组中对应的数字的个数 32 int get_num_of_group(int g) 33 { 34 int t = 10; 35 int k = 1; 36 int ret = 0; 37 while(g >= t){ 38 ret += t/10*9*k; 39 t *= 10; 40 k++; 41 } 42 ret += (g - t/10 + 1) * k; 43 return ret; 44 } 45 46 int main() 47 { 48 int T; 49 //cout<<get_num_of_group(100)<<endl; 50 scanf("%d" , &T); 51 init(); 52 while(T--){ 53 int n; 54 scanf("%d" , &n); 55 int group = 1; 56 int cnt = 1; 57 //group表示第几组,cnt表示对应组中含有的数字的个数 58 while(1){ 59 if(n <= cnt) break; 60 n -= cnt; 61 group++; 62 cnt = get_num_of_group(group); 63 } 64 //cout<<"group"<<group<<" "<<n<<endl; 65 int t = get_bit(n); 66 //cout<<"t " <<t<<endl; 67 int st; 68 //st表示从几位数字开始找起,如st = 10,表示最后这个点属于10-99范围 69 if(t < 0) st = 1 , t = 1; 70 else 71 { 72 st = 1; 73 for(int i=1 ; i<=t-1 ; i++) 74 st *= 10; 75 76 } 77 //cout<<"st " <<st<<endl; 78 while(n > t){ 79 n -= t; 80 st++; 81 } 82 n = t + 1 - n; 83 int ans = st%10; 84 for(int i=1 ; i<=n ; i++){ 85 ans = st%10; 86 st /= 10; 87 } 88 printf("%d\n" , ans); 89 } 90 // cout<<9 + 2*90 + 3*900<<endl; 91 return 0; 92 }
时间: 2024-11-03 03:26:14