• C++算法:第N位数的原理、源码及测试用例


    C++算法第n位数

    本文涉及知识点


    简单的数学知识。

    本博文对应源码,审核比较慢,请耐心等待:
    https://download.csdn.net/download/he_zhidan/88504919

    本博文在CSDN 学院有对应课程。

    题目

    给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字。

    示例 1:

    输入:n = 3

    输出:3

    示例 2:

    输入:n = 11

    输出:0

    解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ,它是 10 的一部分。

    提示:

    1 <= n <= 231 – 1

    分析

    位数

    最小数

    数量

    n位数的数量等于:最小数*9。总位数等于:数量*位数。

    一位数(1到9)

    1

    9

    两位数(10到99)

    10

    90

    三位数(100到999)

    100

    900

    四位数(1000到9999)

    1000

    9000

    ….

    9000000000000000000000…

    大致步骤

    计算是多少位数字。

    计算是那个数。

    从右先左第几位。

    计算此位。

    代码

    核心代码

    class Solution {
    public:
        int findNthDigit(int n) {
            long long llN = n;
            long long llMin = 1;
            int iBitNum = 1;
            //计算是几位数
            for (; llN > llMin * 9 * iBitNum; iBitNum++)
            {
                llN -= llMin * 9 * iBitNum;
                llMin *= 10;
            }
            //计算是那个数
            int iOrder = (llN - 1) / iBitNum;//第几个数(从零开始)
            m_iValue = llMin + iOrder;
            //计算从右向左数,第几位
            int iBitOrder = (iBitNum-1) - (llN - 1) % iBitNum;
            int iValue = m_iValue;
            //计算此位
            while (iBitOrder-- > 0)
            {
                iValue /= 10;
            }
            return iValue %10;
        }
        int m_iValue;
    };

    测试代码

    template<class T>

    void Assert(const T& t1, const T& t2)

    {

             assert(t1 == t2);

    }

    template<class T>

    void Assert(const vector<T>& v1, const vector<T>& v2)

    {

             if (v1.size() != v2.size())

             {

                       assert(false);

                       return;

             }

             for (int i = 0; i < v1.size(); i++)

             {

                       Assert(v1[i], v2[i]);

             }

    }

    int main()

    {

             Solution sln;

             int res = 0;

             res = sln.findNthDigit(1);

             Assert(res, 1);

             Assert(sln.m_iValue, 1);

             res = sln.findNthDigit(9);

             Assert(res, 9);

             Assert(sln.m_iValue, 9);

             res = sln.findNthDigit(10);

             Assert(res, 1);

             Assert(sln.m_iValue, 10);

             res = sln.findNthDigit(11);

             Assert(res, 0);

             Assert(sln.m_iValue, 10);

            

             res = sln.findNthDigit(190);

             Assert(res, 1);

             Assert(sln.m_iValue, 100);

             res = sln.findNthDigit(191);

             Assert(res, 0);

             Assert(sln.m_iValue, 100);

            

             res = sln.findNthDigit(INT_MAX);

             Assert(sln.m_iValue, 250954973);

             Assert(res, 2);

    }

    https://img-blog.csdnimg.cn/ea2601b3918f4aef836b5fe30da2ebf7.gif#pic_center#pic_center

    其它

    学院课程

    基础算法的C++实现课程,请点击下面的CSDN学院的链接。讲义有算法详解。

    2024年1月15之前完全免费,之后绝大部分免费

    https://edu.csdn.net/course/detail/38771

    C#入职培训

    此课程的目的:让新同事更快完成从学生到C#程序员的转换,更快上手完成C#的开发工作。

    https://edu.csdn.net/course/detail/38768

    C++入职培训

    让新同事更快完成从学生到C++程序员的转换,更快上手完成C++的开发工作。

    https://edu.csdn.net/course/detail/32049

    运行验证环境

    Win10 VS2022 Ck++17 或win7 VS2019 C++17

    每天都补充正能量

    好好学习,天天向上。

    事无终始,无务多业。

    是故置本不安者,无务丰末。

    相关下载

    如果你时间宝贵,只想看精华,请到CSDN下载频道下载《闻缺陷则喜算法册》doc版

    https://download.csdn.net/download/he_zhidan/88348653

    https://img-blog.csdnimg.cn/f95ddae62a4e43a68295601c723f92fb.gif#pic_center

  • 相关阅读:
    羊了个羊的接口测试
    2022年找工作确实不易
    聚焦数据库和新兴硬件的技术合力 中科驭数受邀分享基于DPU的数据库异构加速方案
    2022极端高温!人工智能如何预测森林火灾?| 万物AI
    JVM基础:字节码文件详解①
    vue图片验证码
    2016年亚太杯APMCM数学建模大赛A题基于光学信息数据的温度及关键元素含量预测求解全过程文档及程序
    Linux系统上安装docker
    Pytorch-基于RNN的不同语种人名生成模型
    知识积累:PageHelper分页问题,页码小于总页数和大于总页数返回数据问题,PageHelper分页失效
  • 原文地址:https://blog.csdn.net/he_zhidan/article/details/134232240