【C++】数字位数提取:从个位到十位的深入分析与理论拓展

news2024/12/27 10:17:12

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯第一题:提取个位数
    • 解法
    • 代码
    • 解法分析
    • 代码优化
    • 拓展思考:取模运算的普适性
  • 💯第二题:提取十位数
    • 题目解读与思路分析
    • 方法一:使用取模和整除的组合
      • 代码示例
      • 优点与不足
    • 方法二:老师的优化解法 `(a / 10) % 10`
      • 老师代码示例
      • 逻辑分析
      • 对比与结论
  • 💯示例讲解与图示分析
    • 方法一 `(a % 100) / 10` 的操作步骤
    • 方法二 `(a / 10) % 10` 的操作步骤
  • 💯数学方法的延伸:提取更高位数
  • 💯小结


在这里插入图片描述


💯前言

  • 本文旨在对整数操作的数位提取进行系统化的探讨,特别是在 C++ 编程语言环境下。通过逐个案例的深入分析,本文不仅涵盖了个位与十位提取的技术细节,还探讨了不同实现方法的深层逻辑以及背后的数学原理。本文将结合用户与指导老师的解法进行比较,从而为程序优化提供理论支持及最佳实践。此外,为了帮助读者全面掌握这些数值操作的基本原理,我们还会提供大量扩展性建议,涵盖更复杂的位数提取以及通用数学处理方法。这篇文章面向具有较高数学基础与编程技巧的读者,希望通过理论与实践的结合,为复杂整数操作的掌握打下坚实的理论基础
    C++ 参考手册
    在这里插入图片描述

💯第一题:提取个位数

题号:NC21990

题目描述:
输入一个整数 a,求其个位数。

输入描述:
输入一个整数,范围在 int 类型的表示范围内。

输出描述:
输出一个整数,即该数字的个位数。

示例:

  • 输入:102
  • 输出:2

限制条件:

  • 时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
  • 空间限制:C/C++/Rust/Pascal 32M,其他语言64M
  • 64bit IO Format: %lld

题目图示:

  • 整数的个位
    在这里插入图片描述

解法

用户的初始实现通过 a % 10 的取模运算来提取个位数。这种方法极为直接且高效,适用于大多数情形,是数字操作中基础而常见的技巧。它背后的核心原理基于除法运算的余数特性,通过对10取模,即保留了整数的最后一位。
在这里插入图片描述


代码

#include <iostream>
using namespace std;

int main() {
    int a;
    cin >> a;
    cout << a % 10 << endl;
    return 0;
}

在这里插入图片描述


解法分析

  1. 数学原理
    • 通过 % 运算符对 10 取模,可以直接提取出整数的最后一位。这种操作等价于将整数与 10 进行除法运算后求余,从而仅保留个位信息。
    • 举例来说,对于 a = 102,执行 102 % 10 的结果为 2,因此个位数为 2
  2. 负数处理
    • 如果输入为负数,例如 a = -45,则 -45 % 10 = -5
    • 为了确保输出结果为非负,可以使用标准数学函数 abs() 来取绝对值。这样可以避免由于负数带来的不符合预期的结果。
    • 对于 a = -45,取模结果为 -5,使用 abs() 函数后,得到 5,使得输出结果更符合直观的期望。

代码优化

为了处理负数情况,可以在取模运算后应用 abs() 函数,使得输出结果始终为非负值,从而增加代码的健壮性:
在这里插入图片描述

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int a;
    cin >> a;
    cout << abs(a % 10) << endl;
    return 0;
}

在这里插入图片描述

这种优化在实际应用中尤为重要,特别是在涉及可能为负数的输入时。abs() 函数的使用可以确保输出符合预期,增强代码的鲁棒性,并有效避免负值所带来的歧义。


拓展思考:取模运算的普适性

在这里插入图片描述

取模运算广泛应用于提取数位信息的场景。对于不同的基数(例如二进制、八进制等),取模运算可以通过不同的模数来实现灵活的位数操作。例如,若要提取一个数字的百位数,可以使用表达式 a % 1000 / 100。这种方法的核心是先通过取模获取高位信息,再通过整除得到目标位数。

此外,取模运算还广泛用于其他编程场景,例如实现循环边界条件处理,检测数字的奇偶性等。取模的灵活性与通用性使其成为编程中不可或缺的基础工具之一。理解并掌握取模操作的多种应用方式,有助于编程人员在解决更多问题时更加得心应手。


💯第二题:提取十位数

题号:NC21991

题目描述:
输入一个整数 a,求其十位数。

输入描述:
输入一个整数,范围在 int 类型的表示范围内。

输出描述:
输出一个整数,即该数字的十位数。

示例:

  • 输入:123
  • 输出:2

限制条件:

  • 时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
  • 空间限制:C/C++/Rust/Pascal 32M,其他语言64M
  • 64bit IO Format: %lld

题目图示:

  • 整数的十位
    在这里插入图片描述

题目解读与思路分析

本题要求提取整数的十位数,因此需要对输入的整数进行适当的运算,确保能正确地提取十位部分。需要考虑整数可能为正、负数及个位为零的各种特殊情况。针对这一问题,可以采用两种主要的方法来进行解决。

在这里插入图片描述


方法一:使用取模和整除的组合

我最初采用的方法是使用 (a % 100) / 10。其逻辑如下:

  1. 通过 a % 100 提取出数字的最后两位。
  2. 然后对结果执行 / 10,以获得十位的值。

在这里插入图片描述


代码示例

#include <iostream>
using namespace std;

int main() {
    int a;
    cin >> a;
    cout << (a % 100) / 10 << endl;
    return 0;
}

在这里插入图片描述


优点与不足

  1. 优点

    • 逻辑直观清晰,先通过取模操作提取出最后两位数字,再通过整除得到十位数。
    • 该方法的核心在于将目标数位范围缩小至百位以内,再通过整除简化为十位。
  2. 不足

    • 对于负数情况,得到的十位数会为负值,需要再用 abs() 处理以得到正确结果。
    • 例如:a = -456 时,-456 % 100 = -56-56 / 10 = -5,这并不是我们期望的输出结果。
      在这里插入图片描述

优化后的代码:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int a;
    cin >> a;
    cout << abs((a % 100) / 10) << endl;
    return 0;
}

在这里插入图片描述

通过这一改进,我们确保无论输入是正数还是负数,输出的十位数都为非负值,从而使代码的行为更为可控,符合大多数应用场景的预期。


方法二:老师的优化解法 (a / 10) % 10

相比用户的解法,老师给出的 (a / 10) % 10 方法更加简洁且逻辑自洽,尤其是在负数处理方面。
在这里插入图片描述


老师代码示例

#include <iostream>
using namespace std;

int main() {
    int a;
    cin >> a;
    cout << (a / 10) % 10 << endl;
    return 0;
}

在这里插入图片描述


逻辑分析

  1. 步骤
    • 首先对输入整数进行整除 10,以去除个位数,保留十位及更高位。
    • 然后对结果执行 % 10 操作,以获取十位数的值。
  2. 优点
    • 该方法通过直接进行整除操作,再进行取模运算,减少了取模的次数,逻辑更简明,代码更易读。
    • 对于负数,可以结合 abs() 使用,以确保输出结果为正。
  3. 负数处理
    • 当输入为负数时,例如 a = -123,执行 (a / 10) % 10,结果为 -2。通过 abs() 函数可以将其转换为正数,得到 2

在这里插入图片描述


对比与结论

通过上述两种解法的对比,我们可以得出结论:老师的解法 (a / 10) % 10 在逻辑上更加直观,简洁清晰。相比用户的方法,它更符合数学上位数提取的本质,并且减少了不必要的运算步骤。因此,对于这种情况,推荐使用老师的方案来实现位数提取。
在这里插入图片描述


💯示例讲解与图示分析

为了使读者更加深入理解这两种方法的不同之处,我们通过图示详细分析了各个步骤的操作。
在这里插入图片描述


方法一 (a % 100) / 10 的操作步骤

  1. 蓝色框(第一步)a % 100
    • 通过取模操作保留最后两位。例如,若 a = 123456,则 123456 % 100 = 56
  2. 黄色框(第二步)56 / 10
    • 对最后两位进行整除,结果为 5,即十位数。

图示分析:

在这里插入图片描述


方法二 (a / 10) % 10 的操作步骤

  1. 蓝色框(第一步)a / 10
    • 首先去掉个位数。例如,a = 123456 时,123456 / 10 = 12345
  2. 黄色框(第二步)12345 % 10
    • 对得到的数进行取模,结果为 5,即十位数。

图示分析:
在这里插入图片描述

从这种可视化的分析中可以看出,虽然两种方法都能正确提取十位数,但老师的方案在步骤上更为简洁,且逻辑上更符合人们对数位操作的直觉理解。


💯数学方法的延伸:提取更高位数

除了个位与十位之外,我们还可以通过类似的方法提取任意高位的数字:

  1. 百位数提取:可以使用 (a / 100) % 10
    • 例如,a = 123456,执行 (123456 / 100) % 10 得到 4,即百位数。
  2. 千位数提取:可以使用 (a / 1000) % 10
    • 例如,a = 987654,执行 (987654 / 1000) % 10 得到 7,即千位数。

这种方法具有高度的普适性,通过调整除以 10 的次数,可以灵活地逐位提取任何数位的信息。因此,在各类编程竞赛和复杂问题中,这种位数提取方法极具应用价值。无论是 Python、Java 还是其他语言,类似的整数位数提取方法都广泛适用,跨语言的理解对于进一步提升编程技巧至关重要。
在这里插入图片描述


💯小结

  • 在这里插入图片描述
    本文通过对两个 C++ 位数提取问题的详细分析,探讨了多种解决方案及其优化策略。无论是个位还是十位的提取,均可以通过整除取模的组合来简洁实现。

  • 取模运算 是一种非常有效的工具,尤其适合提取个位数及处理循环问题

  • 整除与取模的结合 能够实现对任意位数的精准提取,具备简洁性与高效性

  • 在编写代码时,务必考虑负数,确保程序的健壮性

  • 通过反复的练习和对理论的深入理解,我们能够更加灵活地运用这些数学技巧,解决各种位数提取问题

通过这次的练习与分析,相信你已经不仅掌握了数字位数提取的基本操作,也理解了如何在实际应用中优化代码,使其更加简洁高效。希望本文的分析与讨论能帮助你在编程竞赛实际开发中更加游刃有余,成为你在学习过程中的重要参考工具。理解与掌握这些基础知识,将是你编程之路上最重要的基石之一,让你在面对复杂问题时更加自信与从容


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2251408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opengl 三角形

最后效果&#xff1a; OpenGL version: 4.1 Metal 不知道为啥必须使用VAO 才行。 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <vector>void framebuffer_size_callback(GLFWwindow *window, int width, int heigh…

如何使用Postman优雅地进行接口自动加密与解密

引言 在上一篇文章中&#xff0c;分享了 Requests 自动加解密的方法&#xff0c;本篇文章分享一下更加方便的调试某个服务端接口。 Postman Postman 这个工具后端小伙伴应该相当熟悉了&#xff0c;一般情况下我们会在开发和逆向过程中使用它来快速向接口发送请求&#xff0c;…

PDF view | Chrome PDF Viewer |Chromium PDF Viewer等指纹修改

1、打开https://www.browserscan.net/zh/ 2、将internal-pdf-viewer改为 internal-pdf-viewer-jdtest看下效果&#xff1a; 3、源码修改&#xff1a; third_party\blink\renderer\modules\plugins\dom_plugin_array.cc namespace { DOMPlugin* MakeFakePlugin(String plugin_…

2024143读书笔记|《遇见》——立在城市的飞尘里,我们是一列忧愁而又快乐的树

2024143读书笔记|《遇见》——立在城市的飞尘里&#xff0c;我们是一列忧愁而又快乐的树 第1章 年年岁岁岁岁年年第2章 遇见第3章 有个叫“时间”的家伙走过第4章 初雪第6章 回首风烟 《华语散文温柔的一支笔&#xff1a;张晓风作品集&#xff08;共5册&#xff09;》作者张晓风…

python基础(五)

正则表达式 在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说&#xff0c;正则表达式就是记录文本规则的代码。 符号解释示例说明.匹配任意字符b.t可以匹配bat / but / b#t / b1t等\…

【连接池】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

《业务流程--穿越从概念到实践的丛林》读后感一:什么是业务流程

1.4 流程建模 画流程图常见的方法派别如下: 1)流图。美国国家标准协会(ANSI)制定的规范,利用VISIO中的流程符号进行画图。 2)事件驱动流程链(EPC)。ARIS(集成信息系统架构)。认为流程是由一系列事件触发,并且 针对事件的行为又将引发新的事件,流程的表现为“事件--功…

Sybase数据恢复—Sybase数据库无法启动,Sybase Central连接报错的处理案例

Sybase数据库数据恢复环境&#xff1a; Sybase数据库版本&#xff1a;SQL Anywhere 8.0。 Sybase数据库故障&分析&#xff1a; Sybase数据库无法启动。 错误提示&#xff1a; 使用Sybase Central连接报错。 数据库数据恢复工程师经过检测&#xff0c;发现Sybase数据库出现…

redis基础spark操作redis

Redis内存淘汰策略 将Redis用作缓存时&#xff0c;如果内存空间用满&#xff0c;就会自动驱逐老的数据。 为什么要使用内存淘汰策略呢&#xff1f; 当海量数据涌入redis&#xff0c;导致redis装不下了咋办&#xff0c;我们需要根据redis的内存淘汰策略&#xff0c;淘汰一些不那…

C++学习日记---第14天(蓝桥杯备赛)

笔记复习 1.对象的初始化和清理 对象的初始化和清理是两个非常重要的安全问题&#xff0c;一个对象或者变量没有初始状态&#xff0c;对其使用后果是未知&#xff0c;同样的使用完一个对象或者变量&#xff0c;没有及时清理&#xff0c;也会造成一定的安全问题 构造函数&…

Unity ShaderLab 实现3D物体描边

实现思路&#xff1a; 给物体添加第二个材质球&#xff0c;在shader的顶点着色器中使顶点的位置变大&#xff0c;然后在片元着色器中输出描边颜色。 shader Graph实现如下&#xff1a; ShaderLab实现如下&#xff1a; Shader "Custom/Outline" {Properties{[HDR]_…

【HarmonyOS NEXT】ACL 受限权限申请

关键词&#xff1a;受限开放权限、ACL、鸿蒙 在鸿蒙应用开发过程中&#xff0c;部分权限被受到限制&#xff08;如悬浮窗开发、读取联系人数据、读取公共目录音频文件等权限&#xff09;&#xff0c;但是在我们的应用开发过程中又不得不使用该权限时可向华为申请受限权限&#…

南京仁品耳鼻喉专科医院:12月启动公益义诊月

专业医疗资源送至“家门口”&#xff01;南京仁品耳鼻喉专科医院启动公益义诊月 随着2024年即将步入尾声&#xff0c;南京仁品耳鼻喉医院为回馈社会&#xff0c;提升公众健康福祉&#xff0c;将于12月隆重推出“三甲专家公益义诊月”活动。此次活动旨在通过汇聚众多耳鼻喉领域…

【UE5 C++课程系列笔记】06——定时器的基本使用

目标 使用定时器每秒调用函数打印一句日志信息&#xff0c;并在调用一定次数后停止定时器。 步骤 1. 新建一个Actor类&#xff0c;这里命名为 2. 先在“TimerActor.cpp”中获取定时器管理器 使用定时器管理器来设置定时器&#xff0c;该定时器在2s后启动&#xff0c;然后每…

数据分析的尽头是web APP?

数据分析的尽头是web APP&#xff1f; 在做了一些数据分析的项目&#xff0c;也制作了一些数据分析相关的web APP之后&#xff0c;总结自己的一些想法和大家分享。 1.web APP是呈现数据分析结果的另外一种形式。 数据分析常见的结果是数据分析报告&#xff0c;可以是PPT或者…

看不见的彼方:交换空间——小菜一碟

有个蓝色的链接&#xff0c;先去看看两年前的题目的write up &#xff08;https://github.com/USTC-Hackergame/hackergame2022-writeups/blob/master/official/%E7%9C%8B%E4%B8%8D%E8%A7%81%E7%9A%84%E5%BD%BC%E6%96%B9/README.md&#xff09; 从别人的write up中了解到&…

以达梦为数据库底座时部署的微服务页面报乱码,调整兼容模式

1.问题描述 部署微服务&#xff0c;文件、代码是延用的mysql类型的&#xff0c;部署前做了部分适配&#xff0c;但是在使用dm数据库进行安装的服务在页面上查询出的数据却都是乱码 2.查询官网&#xff0c;注意到一个参数COMPATIBLE_MODE兼容模式的配置 考虑是延用mysql&…

K2升班卷(C++ 3道题)

目录 1.匹配 题目背景 题目描述 输入格式 输出格式 输入输出样例 说明/提示 样例 1 解释 数据规模与约定 提示 2.乘方 题目描述 输入格式 输出格式 输入输出样例 数据规模与约定 3.缺水的王国 题目描述 输入格式 输出格式 输入输出样例 说明/提示 样例解…

Redis(4):主从复制

一、主从复制概述 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。   默认情况下&#xff0c;每台Redis…

Educator头歌:离散数学 - 图论

第1关&#xff1a;图的概念 任务描述 本关任务&#xff1a;学习图的基本概念&#xff0c;完成相关练习。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;图的概念。 图的概念 1.一个图G是一个有序三元组G<V,R,ϕ>&#xff0c;其中V是非空顶点集合&am…