首页 > 代码库 > 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 数学题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。