思路:
规律如下表:
数字的区间范围 | 范围内所有数字的总位数 |
---|---|
0~9 | 1 * 10 |
10~99 | 2 * 90 |
1000~999 | 3 * 900 |
10000~9999 | 4 * 9000 |
… | … |
规律很明显,剩下的就是编程细节。
计算公式在草稿上。草稿如下:
代码实现及验证:
#include <iostream>
using namespace std;
int function(int target) {
target += 1;
int i = 1; //
int acc = 1; // 值为10,100,1000,...
if (target <= 10) {
return target-1;
}
++i;
acc *= 10;
target -= 10;
while (i * 9 * acc < target) {
target -= i * 9 * acc;
acc *= 10;
++i;
}
int firstNum = acc;
int targetNum = (target-1) / i + firstNum;
int remainOfTargetNum = (target - 1) % i;
int divCnt = i - remainOfTargetNum - 1;
while (divCnt--) {
targetNum /= 10;
}
return targetNum % 10;
}
int main()
{
int target = 10;
// 算法输出
for (int i = 0; i < 10000; ++i)
cout << function(i);
cout << endl;
// 正确结果
for (int i = 0; i < 2777; ++i) {
cout << i;
}
system("pause");
return 0;
}