POJ 1019 模拟也可以很经典

很有意思的一道题

发了这道题的帖 结果回复数近两百

参考了大家的想法后

写出了模拟解

本以为本题有巧妙的方法

后来才发现 模拟也可以很漂亮

只要你的代码思路清晰

那么就是好的代码

#include <iostream> #include <cmath> using namespace std; int main() { int count; cin>>count; while (count--) { //这里是要把数列看成一系列的子数列串成 即 1,12,123,...,123...M-1 M //显然在其中i所在的子序列中求解要容易得多 int loc; cin>>loc; int cur = 1; int temp; while (loc>0) //这个while循环的任务是判断i(即loc)在哪个子序列里,并把这个定位信息从 { //全局定位转为局部定为,即仍用loc表示在子序列中的位置 temp = loc; if(cur<10) loc-=cur; else if(cur<100) loc-=(2*cur-9); //-9=9-2*9 else if(cur<1000) loc-=(3*cur-108); //-108=9+2*90-3*99 else if(cur<10000) loc-=(4*cur-1107); //-1107=9+2*90+3*900-4*999 else loc-=(5*cur-11106); //-11106=9+2*90+3*900+4*9000-5*9999 cur++; } loc = temp; //得到了原来序列中loc对应的子序列中的位置,同样用loc表示 int num = 1; while (loc>0) //这个while循环用于计算子序列中的loc发生在哪一个数字上 { //如对于子序列“123456789101112131415...”loc=15发生在数字“12”上 temp = loc; loc -= ((int)log10((double)num)+1); num++; } num--; //这就是上个while循环得到的结果,而temp则记录了loc所代表的位置在这个数字各个数位中的定位 int digit[10]; int j = 0; while (num>0) //将num的各个数位记录在digit数组中,注意是倒序存储 { digit[j++]=num-(num/10)*10; num/=10; } cout<<digit[j-temp]<<endl; //输出结果,对倒序已经进行了考虑 } }

你可能感兴趣的:(POJ 1019 模拟也可以很经典)