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


相关文章
|
2月前
|
芯片
LDO的原理及测试方法
一、基本结构 这是LM317芯片的核心,这个电路单元称为Bandgap Reference带隙基准源。属于模拟集成电路中的经典电路结构。 LDO拓扑结构图 常见的基本结构 利用VBE的负温度系数,而VT是正温度系数,正负温度系数抵消就的得到稳定的基准参考电压了(三极管的方程VBE=VT*In(lC/IS))。 二、测试意义 了解集成电路的内部结构对测试有意义么? 1、了解内部结构,才能更好的理解测试原理或者设计测试方案2、可以学习提升对电路结构的理解能力。 针对LM317,了解了内部简单原理,可以知道1、内部结构设计针对的是温度系数,因此可能受温度的影响,实际也是会受到温度的影
183 88
|
12天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
54 8
|
12天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
42 7
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
59 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
1月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
55 3
|
1月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
39 1
|
1月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
54 2
|
2月前
|
存储 算法 安全
超级好用的C++实用库之sha256算法
超级好用的C++实用库之sha256算法
97 1
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
22 0
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
46 2