这题开始用常规思路总是超时,后来参考鸵鸟兄写的算法总算AC,注意内联函数及_int64类型的运用。
Int64 值类型表示值介于 -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数。
Int64 为比较此类型的实例、将实例的值转换为它的字符串表示形式以及将数字的字符串表示形式转换为此类型的实例提供了相应的方法。
编译用VS2008才不出错,老版本VC++ 6.0报错
#include <iostream> #include <sstream> using namespace std; inline int getlen(int i){//内联函数,获得i的长度 if (i < 10) return 1; else if(i < 100) return 2; else if(i < 1000) return 3; else if(i < 10000) return 4; else if(i < 100000) return 5; return 0; } inline char getc(int num, int p){ stringstream ss; ss << num; string s; ss >> s; return s[p-1]; } int main(){ const int SIZE = 40000; int cases, c , k , pos,i; __int64 sum[SIZE],num;// -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 sum[0] = 0; for (i = 1; i < SIZE; i++) { sum[i] = sum[i-1] +getlen(i); } for (i = 1; i< SIZE; i++) { sum[i] += sum[i-1]; } cin>>cases; while(cases--){ scanf("%d",&num); k = 1; while(sum[k] < num) ++k; pos = num - sum[k-1]; i = 1; while(pos - getlen(i) > 0) { pos -= getlen(i); ++i; } char cc = getc(i,pos); cout <<cc<< endl; } return 0; }