1019

    xiaoxiao2021-12-01  20

    #include <stdio.h> long long int Lv[] = { 0,1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 0 }; long long int Fix[] = { 0, 9, 189, 2889, 38889, 488889, 5888889, 68888889, 788888889 }; long long int LvFix[] = { 0, 45, 9045, 1395495, 189414495, 23939649495 }; long long int fGetTotalN(long long int n, long long int m) {     if (n == 0)     {         return 0;     }     //printf("%d ",n);     n = n - Lv[m] +1;     return n*Fix[m - 1] + n*((1+n)*m) / 2; } //11212312341234512345612345671234567812345678912345678910123456789101112345678910 long long int fGetMaxNumber(long long int index, long long int i_lv) {     long long int lv = i_lv;     long long int i_number = 0;     while (Lv[i_lv ] != 0)     {         if (fGetTotalN(i_number + Lv[i_lv ], lv) < index)         {             i_number += Lv[i_lv];         }else         {             --i_lv;         }     }     return i_number; } long long int fGetNumberByNumber(long long int number,                                  long long int pos) {     int c_n[20] = { 0 };     int i = 0;     while (number > 0)     {         c_n[i++] = number % 10;         number = number / 10;     }     return c_n[i-1-pos]; } long long int fGetNumberByIndex(long long int index) {     long long int i_lv = 0;     while (Fix[i_lv] < index)     {         i_lv += 1;     }     if (i_lv > 0)     {         i_lv -= 1;     }     long long int pos = index - Fix[i_lv];     long long int number = (pos-1) / (i_lv + 1) + Lv[i_lv + 1];     return fGetNumberByNumber(number, (pos-1)%(i_lv + 1)); } int fGetIndex(long long int index) {     for (int i = 0; i < 7; ++i)     {         if (LvFix[i] >= index)         {             return i;         }     } } void fShow(long long int number) {     int lv = fGetIndex(number);     long long int index = number - LvFix[lv - 1];    // printf("%d %d ",lv,index);     long long int max_number = fGetMaxNumber(index, lv);    // printf("%d ",max_number+1);     printf("%d\n",fGetNumberByIndex(index - fGetTotalN(max_number,lv))); } int main() {     int n;     long long int m;     scanf("%d", &n);     //fShow(n);     for (int i = 1; i <=n; ++i)     {         //printf("%d\n",fGetTotalN(i,2));         scanf("%lld", &m);         fShow(m);     } }
    转载请注明原文地址: https://ju.6miu.com/read-679604.html

    最新回复(0)