C语言求解数字序列第n位数字

  1. 思路:对于一个数字序列0123456789 1011121314... 做出以下的分析:

    1. 1位数区间 [0~9] 共10位
    2. 2位数区间 [10~99] 共90位 占据字符串90*2 = 180位
    3. 3位数区间 [100~999] 共900位 占据字符串 900*3 = 2700位。
      ...
    4. n位数区间 [10^n,10^(n+1)-1] 共 9*10^(n-1) 位 占据字符串 9*10^(n-1) *n位
  2. 对于数字n,第一步先确定区间范围,比如n=1000,首先1000>区间1 那么减去区间1的占位 剩余990 继续判断是否位于区间二,区间二总计180位,明显超过了区间二 990-180=810,再判断是否位于区间三 ,区间3的占位 2700,810<2700位与区间3的第810位。

  3. 第二步:找到区间的范围[100,999] 的第810个,也就是从100 作为起始点,第810个数字,由于该区间为3位数区间(3个数字描述一个三位数) 因此第810,实际为第810/3=270个数字,也就是100+270=370,余数为0,也就是370这个数字的第0位,答案呼之欲出为3;

  4. 第三步:求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;
    
}