Created
November 21, 2012 06:31
-
-
Save GZShi/4123387 to your computer and use it in GitHub Desktop.
将一堆整数按顺序排成一串形成一个序列,例如从0到20排成一串可以得到下面这个序列: 01234567891011121314151617181920 这个序列中的每一个位置都对应一个0~9的数,例如,第16位是2。假如这堆整足够大,那么序列中第100000个数时什么?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <Windows.h> | |
// 计算10的整次幂 | |
long mypower(unsigned int e) | |
{ | |
long ret[10] = { | |
1, | |
10, | |
100, | |
1000, | |
10000, | |
100000, | |
1000000, | |
10000000, | |
100000000, | |
1000000000 | |
}; | |
return ret[e%10]; | |
} | |
// 按数字的位数分为n级,例如11为2级,111为3级 | |
// 返回第n级最大的序列号 | |
// 例如:第1级的最大序列号位1,第3级的最大序列号为2800 | |
long level_n_max(int n) | |
{ | |
if(n <= 0) | |
return 1; | |
else | |
return (level_n_max(n-1) + (long)9 * mypower(n-1) * n); | |
} | |
// 输入一个序列值,判断着个序列值对应的数为第几级 | |
// 例如:序列值为191对应的数字为100,是第3级,所以返回3 | |
int get_level(int n) | |
{ | |
int i = 0; | |
while(n > level_n_max(i)) | |
++i; | |
return i; | |
} | |
// 返回一个数字的第n位 | |
// 位数从0开始计数,从右往左 | |
// 例如:当输入num为1234,n为3时,返回'1' | |
char get_num_n_char(int num, int n) | |
{ | |
while(n > 0) | |
{ | |
num = num / 10; | |
--n; | |
} | |
return num%10 + '0'; | |
} | |
// 返回序列中的第n个字符 | |
char get_n_char(int n) | |
{ | |
if(n <= 10) | |
return '0' + n - 1; | |
else | |
{ | |
int i = get_level(n); | |
int temp = level_n_max(i - 1); | |
int num = (n - temp - 1)/i + mypower(i-1); // 这个序列号对应的整个数字 | |
// printf(">>%d\n", num); // 应该是递增打印的 | |
return get_num_n_char(num, i - (n+1) % (i) - 1); | |
} | |
} | |
int main(int argc, char const *argv[]) | |
{ | |
int n = 0; | |
while(n != 999999) // 测试程序,打印序列的前面一部分 | |
{ | |
scanf("%d", &n); | |
printf(">>>>>>> %c\n", get_n_char(n)); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment