数字序列中某一位的数字

数字按照0123456789101112131415161718192021…的顺序排列。第5位(从0开始计数)为5,第13位为1,第19位为4…… 求任意第n位对应的数字。

思路:

  • 直观方法做枚举。每枚举一个数字的时候,求出该数字是几位数,并把数字的位数和前面的所有数字的位数相加。当累加的数位大于n时,那么第n位数字一定在这个数字里。
  • 以第15位数字2为例(2隶属与12,两位数,位于12从左侧以0号开始下标为1的位置) 步骤1:首先确定该数字是属于几位数的; 如果是一位数,n<9;如果是两位数,n<9+90*2=189; 说明是两位数。 步骤2:确定该数字属于哪个数。10+(15-10)/2= 12。 步骤3:确定是该数中哪一位。15-10-(12-10)*2 = 1, 所以位于“12”的下标为1的位置,即数字2。 以第1001位数字7为例 步骤1:首先确定该数字是属于几位数的; 如果是一位数,n<9;如果是两位数,n<9+90*2=189;如果是三位数,n<189+900*3=2889; 说明是三位数。 步骤2:确定该数字属于哪个数。100+(1001-190)/3= 370。 步骤3:确定是该数中哪一位。1001-190-(370-100)*3 = 1,所以位于“370”的下标为1的位置,即数字1。
#include <iostream>
#include <cmath>

using namespace std;

int core(int num);
int getSizeOfDigit(int i);
int getResult(int digit, int num);

int main(){
    int num = 0;
    while (num != -1){
        cout << "type a size" << endl;
        cin >> num;
        int result = core(num);
        cout << result << endl;
    }
    return 0;
}

int core(int num){
    if (num < 0)
        return -1;
    int digit = 1;
    while (true){
        int numbers = getSizeOfDigit(digit);
        if (num < numbers * digit)
            return getResult(digit, num);
        num -= digit * numbers;
        ++digit;
    }
}
int getSizeOfDigit(int i){
    if (i == 1)
        return 10;
    return 9 * pow(10, i - 1);
}

int getResult(int digit, int num){
    int beginNum = 0;
    if (digit == 1)
        beginNum = 0;
    else
        beginNum = pow(10, digit - 1);
    int resultNum = beginNum + num / digit;
    int countFromRight = digit - num % digit;
    for (int i = 0; i < countFromRight - 1; ++i)
        resultNum /= 10;
    return resultNum % 10;

}

原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8613204.html

时间: 2024-11-09 23:18:08

数字序列中某一位的数字的相关文章

剑指Offer对答如流系列 - 数字序列中某一位的数字

面试题44:数字序列中某一位的数字 题目描述 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一个函数求任意位对应的数字. 问题分析 这个寻求高效的解决方法,也是寻找规律: 个位数的个数一共有10个,即0~9,共占了10*1位数字:(特殊) 两位数的个数一共有90个,即10~99,每个数字占两位,共占了90*2位数字: -- m位数的个数一共有9*10^(m-1)个,每个数字占m位,

57. 数字序列中某一位的数字 (不懂)

算法1 以第15位数字1为例(1隶属与12,两位数,位于12从左侧以0号开始下标为0的位置)步骤1:首先确定该数字是属于几位数的;如果是一位数,n<9;如果是两位数,n<9+90X2=189;说明是两位数.因为是从0开始数数.0-9可以表示10个数字,从0开始数可以表示到9.10-99一共有90X2个数字,所以数到两位数能够数到9+90X2=189.步骤2:确定该数字属于哪个数.10+(15-10)/2= 12.步骤3:确定是该数中哪一位.15-10-(12-10)*2-1 = 0, 所以位于

《剑指offer》第四十四题:数字序列中某一位的数字

// 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一 // 个函数求任意位对应的数字. #include <iostream> #include <algorithm> using namespace std; int countOfIntegers(int digits); int digitAtIndex(

剑指offer:数字序列中某一位的数字

题目描述数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一个函数,求任意第n位对应的数字. # -*- coding: utf-8 -*- # @Time : 2019-07-09 22:51 # @Author : Jayce Wong # @ProjectName : job # @FileName : digitAtIndex.py # @Blog : https://blog

剑指offer-面试题44-数字序列中某一位的数字-脑筋急转弯

/* 题目: 数字以0123456789101112131415…的格式序列化到一个字符序列中. 在这个序列中,第5位(从0开始计数,即从第0位开始)是5,第13位是1,第19位是4,等等. 请写一个函数,求任意第n位对应的数字. */ #include<iostream> #include<string.h> using namespace std; //自己实现pow,使用codeblocks中的pow,会转化为浮点数进行截断,得到的结果不准确. int pow(int num

得到一个数字中每一位的数字

学习编程也有一段时间了,随着学习的不断深入,我越来越体会到了算法的重要性,最近遇到了一些非常有意思的算法,比如打印水仙花数.将数字逆置,在这两个算法中会用到一个数字钟每一位的值 如:判断数字123是否是水仙花数需要得到每一位的数字 通常计算每一位的数字的算法是: 个位:a = 123 % 10 = 3 十位:b  = 123 %100 / 10 = 2 百位::c = 123 % 100 = 2 随着位数的越来越大,这种方法满足不了程序的需求 比如计算:123445677777777777777

笔试算法题(34):从数字序列中寻找仅出现一次的数字 &amp; 最大公约数(GCD)问题

出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字: 分析: 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它本身,所以当所有的数字序列都异或操作之后,所有出现两次的数字异或操作之后的结果都为0,则最后剩下的结果就是那个仅出现了一次的数字: 如果有多个数字都仅仅出现了一次,则上述的异或操作方法不再适用:如果确定只有两个数字只出现了一次,则可以利用X+Y=a和XY=b求解: 解题: 1 int findSin

PHP数字格式化,每三位逗号分隔数字,可以保留小数

在报价的时候为了给浏览者更清晰明确的数字,所以需要用到数字格式化,有两种方法,一种自己写函数,另一种当然是系统自带的,其实我更喜欢系统自带的. 先来系统简单的: string number_format ( float number [, int decimals [, string dec_point, string thousands_sep]] ): 示例代码 echo number_format('169856420'); 输出结果将为: 169,856,420 示例代码 echo nu

数字图像处理------中值滤波

一 中值滤波概念 中值滤波算法以某像素的领域图像区域中的像素值的排序为基础,将像素领域内灰度的中值代替该像素的值[1]: 如:以3*3的领域为例求中值滤波中像素5的值 图1 1)int pixel[9]中存储像素1,像素2...像素9的值: 2)对数组pixel[9]进行排序操作: 3)像素5的值即为数组pixel[9]的中值pixel[4]. 中值滤波对处理椒盐噪声非常有效. 二 中值滤波代码实现 项目工程:https://github.com/ranjiewwen/Everyday_Prac