首页 > 代码库 > POJ 1019 数学题

POJ 1019 数学题

 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         else71         {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 }

 

POJ 1019 数学题