POJ 1019 数学题
2014-12-13 23:20
169 查看
#include <cstdio> #include <cstring> using namespace std; int sum[20]; //sum[i]表示尾数为i的组最大可达到的数字个数 void init() { sum[0] = 0; sum[1] = 9; sum[2] = 189; sum[3] = 2889; sum[4] = 38889; sum[5] = 488889; sum[6] = 5888889; } //找到最后对应的组数属于的范围是在多少位的整数上,返回整数的位数 int get_bit(int &n) { for(int i = 0 ; i<6 ; i++){ if(n > sum[i] && n <= sum[i+1]) { n -= sum[i]; return i+1; } } return -1; } //返回g这个组中对应的数字的个数 int get_num_of_group(int g) { int t = 10; int k = 1; int ret = 0; while(g >= t){ ret += t/10*9*k; t *= 10; k++; } ret += (g - t/10 + 1) * k; return ret; } int main() { int T; //cout<<get_num_of_group(100)<<endl; scanf("%d" , &T); init(); while(T--){ int n; scanf("%d" , &n); int group = 1; int cnt = 1; //group表示第几组,cnt表示对应组中含有的数字的个数 while(1){ if(n <= cnt) break; n -= cnt; group++; cnt = get_num_of_group(group); } //cout<<"group"<<group<<" "<<n<<endl; int t = get_bit(n); //cout<<"t " <<t<<endl; int st; //st表示从几位数字开始找起,如st = 10,表示最后这个点属于10-99范围 if(t < 0) st = 1 , t = 1; else { st = 1; for(int i=1 ; i<=t-1 ; i++) st *= 10; } //cout<<"st " <<st<<endl; while(n > t){ n -= t; st++; } n = t + 1 - n; int ans = st%10; for(int i=1 ; i<=n ; i++){ ans = st%10; st /= 10; } printf("%d\n" , ans); } // cout<<9 + 2*90 + 3*900<<endl; return 0; }
相关文章推荐
- POJ1019 NumberSequence 【数学公式转化题】
- poj 1019 Number Sequence 数学
- POJ-1019-Number Sequence-组合数学
- poj 1019 (数学计算)
- poj1019 Number Sequence 二分+数学+打表
- POJ1019 ---简单的数学找规律题
- poj 1019 Number Sequence 【组合数学+数字x的位宽函数】
- poj 1019 Number Sequence 数学&模拟
- poj1019——Number Sequence(数学)
- poj 1019 Number Sequence 第i位上的数字 (组合数学)
- poj 1019(数学题)
- poj1019 很好的一道数学题 思路挺巧
- POJ1019 ZOJ1410 UVA10706 Number Sequence【数学】
- POJ1019 ZOJ1410 UVA10706 Number Sequence【数学】
- POJ 1019 Number Sequence(组合数学)
- POJ-1019-数学规律
- POJ-1019 Number Sequence 数学
- poj——1019(数学)
- POJ 1019数学模拟题
- POJ 1019 数学