99// 个函数求任意位对应的数字。
1010
1111#include < iostream>
12+ #include < algorithm>
1213
1314using namespace std ;
1415
@@ -18,74 +19,69 @@ int beginNumber(int digits);
1819
1920int digitAtIndex (int index)
2021{
21- if (index < 0 )
22- return -1 ;
22+ if (index < 0 )
23+ return -1 ;
2324
24- int digits = 1 ;
25- while (true )
26- {
27- int numbers = countOfIntegers (digits);
28- if (index < numbers * digits)
29- return digitAtIndex (index, digits);
25+ int digits = 1 ;
26+ while (true )
27+ {
28+ int numbers = countOfIntegers (digits);
29+ if (index < numbers * digits)
30+ return digitAtIndex (index, digits);
3031
31- index -= digits * numbers;
32- digits++;
33- }
32+ index -= digits * numbers;
33+ digits++;
34+ }
3435
35- return -1 ;
36+ return -1 ;
3637}
3738
3839int countOfIntegers (int digits)
3940{
40- if (digits == 1 )
41- return 10 ;
41+ if (digits == 1 )
42+ return 10 ;
4243
43- int count = 1 ;
44- for (int i = 1 ; i < digits; ++i)
45- count *= 10 ;
46- return 9 * count;
44+ int count = (int ) std::pow (10 , digits - 1 );
45+ return 9 * count;
4746}
4847
4948int digitAtIndex (int index, int digits)
5049{
51- int number = beginNumber (digits) + index / digits;
52- int indexFromRight = digits - index % digits;
53- for (int i = 1 ; i < indexFromRight; ++i)
54- number /= 10 ;
55- return number % 10 ;
50+ int number = beginNumber (digits) + index / digits;
51+ int indexFromRight = digits - index % digits;
52+ for (int i = 1 ; i < indexFromRight; ++i)
53+ number /= 10 ;
54+ return number % 10 ;
5655}
5756
5857int beginNumber (int digits)
5958{
60- if (digits == 1 )
61- return 0 ;
59+ if (digits == 1 )
60+ return 0 ;
6261
63- int begin = 1 ;
64- for (int i = 1 ; i < digits; ++i)
65- begin *= 10 ;
66- return begin;
62+ return (int ) std::pow (10 , digits - 1 );
6763}
6864
6965// ====================测试代码====================
7066void test (const char * testName, int inputIndex, int expectedOutput)
7167{
72- if (digitAtIndex (inputIndex) == expectedOutput)
73- cout << testName << " passed." << endl;
74- else
75- cout << testName << " FAILED." << endl;
68+ if (digitAtIndex (inputIndex) == expectedOutput)
69+ cout << testName << " passed." << endl;
70+ else
71+ cout << testName << " FAILED." << endl;
7672}
7773
7874
7975int main ()
8076{
81- test (" Test1" , 0 , 0 );
82- test (" Test2" , 1 , 1 );
83- test (" Test3" , 9 , 9 );
84- test (" Test4" , 10 , 1 );
85- test (" Test5" , 189 , 9 ); // 数字99的最后一位,9
86- test (" Test6" , 190 , 1 ); // 数字100的第一位,1
87- test (" Test7" , 1000 , 3 ); // 数字370的第一位,3
88- test (" Test8" , 1001 , 7 ); // 数字370的第二位,7
89- test (" Test9" , 1002 , 0 ); // 数字370的第三位,0
90- return 0 ;
77+ test (" Test1" , 0 , 0 );
78+ test (" Test2" , 1 , 1 );
79+ test (" Test3" , 9 , 9 );
80+ test (" Test4" , 10 , 1 );
81+ test (" Test5" , 189 , 9 ); // 数字99的最后一位,9
82+ test (" Test6" , 190 , 1 ); // 数字100的第一位,1
83+ test (" Test7" , 1000 , 3 ); // 数字370的第一位,3
84+ test (" Test8" , 1001 , 7 ); // 数字370的第二位,7
85+ test (" Test9" , 1002 , 0 ); // 数字370的第三位,0
86+ return 0 ;
9187}
0 commit comments