一、题目
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。
二、关键
三、解释
p225.
四、代码
#include <iostream>
#include <algorithm>
using namespace std;
int countOfIntegers(int digits); //m位的数字共有多少个?
//当知道要找的那位数位于某m位数之中后,使用本函数找出那一位数字
int digitAtIndex(int index, int digits);
int beginNumber(int digits); //第一个m位数的求解函数
int digitAtIndex(int index)
{
if(index < 0)
return -1;
int digits = 1;
while(true)
{
int numbers = countOfIntegers(digits);
if(index < numbers * digits)
return digitAtIndex(index, digits);
index -= digits * numbers;
digits++;
}
return -1;
}
int countOfIntegers(int digits) //m位的数字共有多少个?
{
if(digits == 1)
return 10;
int count = (int) std::pow(10, digits - 1);
return 9 * count;
}
//当知道要找的那位数位于某m位数之中后,使用本函数找出那一位数字
int digitAtIndex(int index, int digits)
{
int number = beginNumber(digits) + index / digits;
int indexFromRight = digits - index % digits;
for(int i = 1; i < indexFromRight; ++i)
number /= 10;
return number % 10;
}
//第一个m位数的求解函数
int beginNumber(int digits)
{
if(digits == 1)
return 0;
return (int) std::pow(10, digits - 1);
}
// ====================测试代码====================
void test(const char* testName, int inputIndex, int expectedOutput)
{
if(digitAtIndex(inputIndex) == expectedOutput)
cout << testName << " passed." << endl;
else
cout << testName << " FAILED." << endl;
}
int main()
{
test("Test1", 0, 0);
test("Test2", 1, 1);
test("Test3", 9, 9);
test("Test4", 10, 1);
test("Test5", 189, 9); // 数字99的最后一位,9
test("Test6", 190, 1); // 数字100的第一位,1
test("Test7", 1000, 3); // 数字370的第一位,3
test("Test8", 1001, 7); // 数字370的第二位,7
test("Test9", 1002, 0); // 数字370的第三位,0
return 0;
}