Skip to content

Instantly share code, notes, and snippets.

@GZShi
Created November 21, 2012 06:31
Show Gist options
  • Save GZShi/4123387 to your computer and use it in GitHub Desktop.
Save GZShi/4123387 to your computer and use it in GitHub Desktop.
将一堆整数按顺序排成一串形成一个序列,例如从0到20排成一串可以得到下面这个序列: 01234567891011121314151617181920 这个序列中的每一个位置都对应一个0~9的数,例如,第16位是2。假如这堆整足够大,那么序列中第100000个数时什么?
#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