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);
}

其它

学院课程

基础算法的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


相关文章
|
1天前
|
自然语言处理 算法 搜索推荐
分词算法的基本原理及应用
分词算法的基本原理及应用
|
5天前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
10天前
|
机器学习/深度学习 算法 BI
机器学习笔记(一) 感知机算法 之 原理篇
机器学习笔记(一) 感知机算法 之 原理篇
|
9天前
|
机器学习/深度学习 数据采集 算法
KNN算法原理及应用(一)
**KNN算法**是一种监督学习的分类算法,适用于解决分类问题。它基于实例学习,无需训练过程,当新样本到来时,通过计算新样本与已有训练样本之间的距离,找到最近的K个邻居,然后根据邻居的类别进行多数表决(或加权表决)来预测新样本的类别。K值的选择、距离度量方式和分类决策规则是KNN的关键要素。KNN简单易懂,但计算复杂度随样本量增加而增加,适用于小规模数据集。在鸢尾花数据集等经典问题上表现良好,同时能处理多分类任务,并可应用于回归和数据预处理中的缺失值填充。
KNN算法原理及应用(一)
|
13天前
|
机器学习/深度学习 算法 Python
【算法】深入浅出爬山算法:原理、实现与应用
【算法】深入浅出爬山算法:原理、实现与应用
22 3
|
16天前
|
C++
【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码
【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码
|
16天前
|
编译器 API C++
【感受C++的魅力】:用C++演奏歌曲《起风了》——含完整源码
【感受C++的魅力】:用C++演奏歌曲《起风了》——含完整源码
|
17天前
|
机器学习/深度学习 传感器 算法
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
|
3天前
|
存储 算法 安全
深入解析RSA算法原理及其安全性机制
深入解析RSA算法原理及其安全性机制
|
3天前
|
存储 算法 安全
MD5哈希算法:原理、应用与安全性深入解析
MD5哈希算法:原理、应用与安全性深入解析