C语言求解数字序列第n位数字
-
思路:对于一个数字序列0123456789 1011121314... 做出以下的分析:
- 1位数区间 [0~9] 共10位
- 2位数区间 [10~99] 共90位 占据字符串90*2 = 180位
- 3位数区间 [100~999] 共900位 占据字符串 900*3 = 2700位。
... - n位数区间 [10^n,10^(n+1)-1] 共 9*10^(n-1) 位 占据字符串 9*10^(n-1) *n位
-
对于数字n,第一步先确定区间范围,比如n=1000,首先1000>区间1 那么减去区间1的占位 剩余990 继续判断是否位于区间二,区间二总计180位,明显超过了区间二 990-180=810,再判断是否位于区间三 ,区间3的占位 2700,810<2700位与区间3的第810位。
-
第二步:找到区间的范围[100,999] 的第810个,也就是从100 作为起始点,第810个数字,由于该区间为3位数区间(3个数字描述一个三位数) 因此第810,实际为第810/3=270个数字,也就是100+270=370,余数为0,也就是370这个数字的第0位,答案呼之欲出为3;
-
第三步:求370的第0位数字,这个时候位数3已知,遍历除法求余数即可
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
int findNthDigit(int n ) {
//区间1 直接返回
if(n<10)
return n;
//首先确定n所在的区间
//区间1 [0,9) 共 10
//区间2 [10,99) 共 90*2=180
//区间3 [100,999) 共 900*3 = 2700
//...
//区间9 [100000000,999999999) 共 9000000000 * 9 =81 00000000
//初始化区间序号 减去上一个区间
n-=10;
int interval_num=2;
//初始化基本区间大小
int base_size=90;
//遍历确定区间序号 说明超出当前区间
long interval_size=base_size*interval_num;
//区间头和区间尾
int head_interval=10;
int tail_interval=99;
while(n-interval_size>=0){
//先减去上一个区间
n-=interval_size;
interval_num++;
base_size *=10;
interval_size=base_size*interval_num;
head_interval*=10;
tail_interval=head_interval*10-1;
}
//锁定区间号:interval_num 也就是区间[head_interval, tail_interval]的第n个 其中区间的数字位数为interval_num
//(n/interval_num+head_interval+1)的第n%interval_num位
int num=n/interval_num+head_interval;
int order=n%interval_num;
//接下来求 num的第order位
for(int i=0;i<interval_num-order-1;i++){
num=num/10;
}
return num%10;
}