“拨”出数位上的数字 - 多种思路实现反向输出一个四位数(一)

简介: 本文介绍了编程中一个经典的入门题目——反向输出X位数,特别是以反向输出四位数为例,探讨了多种实现方法。这些方法包括使用取模运算分别获取数位、循环取数、利用scanf的宽度控制以及使用数组。每种方法都有其特点,适用于不同的场景。文章旨在帮助初学者拓宽编程思路,并鼓励读者讨论和分享更多实现方式。

前言


“反向输出一个X位数”是C语言乃至其它编程语言入门的一道经典例题。虽然难度不大,但其实现思路是多样的(共同的核心是如何拨出数位上的数字,并重新组合)。


对于初学者的学习而言,编程思路和代码实现自然是多多益善。并且,该编程问题容易作为一个思路模块出现在更大更复杂的编程项目中。因而,本文以“反向输出一个4位数为例”,整理了容易接触到的一些如何“拨出各个数位上的数字”的几种方法,而各个实现方法的利弊交给诸位读者自行理解与权衡,同时在最后添加了一道相对复杂的变式拓展习题。


希望对诸位读者学习C语言有所帮助。若诸位读者有更好的实现办法,非常欢迎各位指出讨论!


一、引例 -- 反向输出一个四位数

1. 题干描述



牛客网OJ题链接:


https://www.nowcoder.com/practice/1f7c1d67446e4361bf4af67c08e0b8b0?tpId=107&&tqId=33300&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking


2. 思路简述


总体思路非常简单:反向输出一个四位数,可以理解为将该四位数的个、十、百、千四个数位上的数字取出,并以相反的顺序重新组合。


如 1234,取出个位数4,十位数3,百位数2,千位数1,反向按千,百,十,个的顺序重组,即为4321.


二、实现思路 -- 拨出数字


思路一:用取模运算分别拨出数位


代码


//方法一
#include<stdio.h>
 
int main(){
    int num = 0;
    int ge,shi,bai,qian;    //分别接受各个数位上的数字
 
    scanf("%d",&num);    //输入一个四位数
 
    ge = num/1%10;
    shi = num/10%10;
    bai = num/100%10;
    qian = num/1000%10;
 
    printf("%d%d%d%d",ge,shi,bai,qian);
    
    return 0;
}


说明


拨出数位上的数字的常用方法:num/数位%10


例如,要取千位上的数字,则num/1000%10;要取百位上的数字,则num/100%10。以此类推,可以分别取出所有数位上的数字。


该方法的好处是,在取出数字后可以最灵活简便地进行组合。毕竟单个数字已经拿到手了,具体怎么排列(如不要反向输出,而要输出3124,4231等),完全可以任意。并且可以拿数位上的数进行任意的运算,以达到题干的某些要求。


例如经典例题水仙花数,水仙花数指的是一个三位数,个位³+十位³+百位³ = 这个数本身。那么完全可以用上述办法实现:



//示例-水仙花数
 
ge = num/1%10;
shi = num/10%10;
bai = num/100%10;
 
//达到如下条件的数称之为水仙花数:
ge*ge*ge + shi*shi*shi + bai*bai*bai == num


是一种非常容易想到的思路。


当然,这种方法不适合数量级比较大的情况。要是不止是四位数,更有五位数、六位数,显然这种方法就太麻烦了。


思路二:循环取数


代码


//方法二
 
int main(){
    int num = 0;
    scanf("%d",&num);
    while(num){
        printf("%d",num % 10);
        num /= 10;
    }
 
    return 0;
}


说明


这个思路与上一个比起来,看着令人舒服地多。它依然用到取模运算,但与思路一略有差别。它的实现流程是:


1. 模运算从低位到高位取出各位上的数字,并打印。


2. 除运算降低数位。


如此循环往复。以1234为例:


1234 % 10  得到个位上数字 4,由于它先被取出来打印,所以它最后也排在最前面。


1234 / 10  得到数位比之前低一位的新数 123  (其实也不难理解,我的目的就是把数位上的数取下来,既然个位数字4已经被我拿到了,那还留着4干什么?除运算把它扔掉了!)


这个思路还是比较巧妙的。虽然它的时间复杂度为O(N),但它确实比思路一更适合数位更多的情况。三位数、五位数、七位数的逆向它都能实现,而不需要再开辟新的变量。


思路三:scanf -- "%1d"

代码


//方法三
#include<stdio.h>
 
int main(){
    int a,b,c,d;
    scanf("%1d%1d%1d%1d",&a,&b,&c,&d);
    printf("%d%d%d%d",d,c,b,a);
 
    return 0;
}


说明



采取控制宽域输入的办法,直接取数,简单粗暴。该程序的实现原理如下:


"%*d"  可以理解为scanf从左向右一次性读入输入数的宽度(或从缓存区一次性取走的数字的个数),"%1d"即从左到右一次读入1个数字。



当输入1234 时,该程序的执行流程是这样的:


1给a        a = 1


2给b        b = 2


3给c        c = 3


4给d        d = 4


输出 d c b a,即 4321


当然,"%2d"则表示从左到右一次性读入两个。下图中,12给a,34给b



思路四:数组


代码


//方法四
#include<stdio.h>
 
int main()
{
    char ch[10];
    scanf("%s", ch);
    for (int i = 3; i >=0; i--)
    {
        printf("%c", ch[i]);
    }
    return 0;
}


说明

数组的办法也非常容易想到。采取数组的倒序遍历,可以直观地将四位数逆向输出,不需要特别地去“取数”。


“拨”出数位上的数字 - 多种思路实现反向输出一个四位数(二) + https://developer.aliyun.com/article/1518249?spm=a2c6h.13148508.setting.19.16ee4f0ewLnn61

相关文章
|
Web App开发 缓存 JavaScript
【安装指南】nodejs下载、安装与配置详细教程
这篇博文详细介绍了 Node.js 的下载、安装与配置过程,为初学者提供了清晰的指南。读者通过该教程可以轻松完成 Node.js 的安装,了解相关配置和基本操作。文章首先介绍了 Node.js 的背景和应用场景,随后详细说明了下载安装包、安装步骤以及配置环境变量的方法。作者用简洁明了的语言,配以步骤图示,使得读者能够轻松跟随教程完成操作。总的来说,这篇文章为初学者提供了一个友好的入门指南,使他们能够顺利开始使用 Node.js 进行开发。
6168 2
【安装指南】nodejs下载、安装与配置详细教程
|
8月前
|
存储 人工智能 JSON
别被术语吓跑!零基础大模型微调指南:从“调教”逻辑到实战手册
AI博主手把手教你微调大模型!用大白话拆解LoRA、QLoRA等术语,从原理到实操(数据准备→环境配置→参数设置→效果评估),全程可视化工具推荐,8GB显卡也能跑。让通用AI变身懂你的垂直领域助手!
1070 5
|
9月前
|
Kubernetes 监控 数据可视化
一文掌握k8s的升级更新策略
K8S中通过`spec.strategy`设置Pod替换策略,支持Recreate(重建)和RollingUpdate(滚动升级)。默认为滚动升级,可设`maxUnavailable`和`maxSurge`控制升级过程,实现无中断更新。可通过xkube平台可视化配置。
708 1
|
10月前
|
芯片 C++ Perl
南京观海微电子---多路降压稳压DC-DC开关电源电路设计(3.3V、5V、12V、ADJ)
LM2596是一款高效率降压稳压芯片,支持3A输出电流,输入电压可达40V,具有过热、限流保护功能。提供固定(3.3V/5V/12V)和可调(ADJ)版本,广泛用于电源转换设计。
南京观海微电子---多路降压稳压DC-DC开关电源电路设计(3.3V、5V、12V、ADJ)
|
IDE 开发工具 Python
python中SyntaxError: unexpected EOF while parsing(语法错误:解析时遇到意外的文件结束)
【5月更文挑战第14天】python中SyntaxError: unexpected EOF while parsing(语法错误:解析时遇到意外的文件结束)
2545 6
|
监控 安全 网络安全
网络安全与信息安全:防范网络威胁的关键策略
【5月更文挑战第29天】在数字化时代,网络安全漏洞、加密技术以及安全意识构成了维护信息安全的三大支柱。本文将深入探讨这些领域内的最新发展,揭示它们如何协同工作以保护个人和企业免受网络攻击和数据泄露的风险。通过分析当前的威胁景观,我们还将提供实用的策略来加强防御机制,确保信息的安全和隐私得到充分保护。
|
Linux 虚拟化
VMware虚拟机中Linux系统磁盘空间扩容实战
VMware虚拟机中Linux系统磁盘空间扩容实战
2286 0
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
1187 6
|
存储 前端开发 调度
揭秘计算机内部通信:探秘数据、地址与控制信号的奥秘
本文深入剖析计算机总线的核心概念,探讨数据、地址和控制信号的传输,揭示了计算机内部各组件间通信的精妙机制。了解总线系统,将带你走进计算机硬件的奥秘,深化对计算机内部工作原理的理解。
1327 1

热门文章

最新文章