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

简介: ```markdown编写函数,统计正整数中零的个数和最大数字。例如:1080有2个零,最大数字是8。主函数负责输入正整数。解题思路:通过循环取数,逐位检查,更新零的计数器和最大数字。示例代码使用C++实现,通过传址调用来改变主函数中的值。注意,循环遍历数位体现了对每个数位的处理思想。```

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


三、变式拓展题 -- 编写函数,实现统计和输出一个正整数中各位数字中零的个数,及各位数字中最大者。


1. 题干描述


编写函数,实现统计和输出一个正整数中各位数字中零的个数,及各位数字中最大者。

例如:1080其零的个数是2,各位数字中最大者是8。主函数负责正整数的输入。


2. 解题思路


代码


#include<stdio.h>
 
void fun(int n, int* zeroCount, int* maxDigit){
  *zeroCount = 0;    //计数器:计0的个数
  *maxDigit = -1;    //初始化,-1正常情况下不可能取到,故以此为标记
  
    while(n!=0){
    int d = n % 10;    //同上述思路二,循环取数
 
    if( !d ){
      (*zeroCount)++;    //如果取出的这个数为0,计数器++
    }
 
    if(d > *maxDigit){
      *maxDigit = d;    //如果取出的这个数比预设的最大数更大,则取代
    }
 
    n = n/10;
  }
}
 
//主函数
int main(){
  int n;
    int zc, md;    //分表代表fun中的zeroCount和maxDigit
                   //由于输出操作在主函数中实现,因而将要输出的数作为实参传入fun
 
  printf("Please input an integer:");    //输入一个任意的正整数
  scanf("%d",&n);
 
  fun(n, &zc, &md);    //函数调用
  printf("%d has %d zero(s), the max digit is %d",n,zc,md);
    
    return 0;
}


说明


1. 用函数的传址调用,主函数中定义zc,md用以输出。


2. 在fun函数中需要直接控制改变main函数中的值。


3. 该题是引例思路的一个小型的综合运用。本题中fun函数内,while循环即思路二循环取数的化用,while循环中的第一句语句与最后一句语句完全就是思路二的模板。计数器和取最大值的语句也并不难想到,将它们实现嵌套在其内,配合变量即可包装成一个可行的函数。


4. 从本题中还能得出,循环取数隐含了一种“遍历各个数位”的思想。该题虽然没有明说要“取数”,但依然和引例的思路二大同小异:要遍历一遍每个数位。


5. 要知道为什么选取思路二。还记得我们上面说过,思路二对整数的长度要求不限吗?正是这个优点。若采用其它的思路,不是说完全无法实现,而是确实会麻烦一些。以下展示了一个思路不清晰写出的“惨案”。


反例


大致浏览即可,勿学!(代码风格是C++)


//复杂化了!!!不建议!!!
#include<iostream>
#include<math.h>
using namespace std;
 
int digitX(int x){
  int dgt = 0;
  while(x){
    x /= 10;
    dgt++;
  }
  return dgt; 
}//求数的位数
 
void stcs(int x){
  int a[81] = {0};
  int i;
  int cnt = 0;
 
  for(i=0; i < digitX(x); i++){
    a[i] = x/(int)pow(10,i)%10;
    if(a[i]==0){
      cnt++;
    }
  }
 
  cout << "共有 " << cnt << " 个0" << endl;
 
  int maxI=i;
 
  for(i=0; i <= digitX(x); i++){
    if(a[i] > a[maxI]){
      int tmp;
      tmp = a[i];
      a[i] = a[maxI];
      a[maxI] = tmp;
    }
  }
 
  cout<<"最大的数字是 "<<a[maxI]<<endl;//输出最大的数
}
 
int main(){
  //1、编写函数,实现统计和输出一个正整数中各位数字中零的个数,及各位数字中最大者。
  int num,digit;
  cout << "请输入一个正整数:";
  cin >> num;
  digit = digitX(num);
  cout << "这个数共有 " << digit << " 位" << endl;
  stcs(num);
 
    return 0;
}


这片代码实现并不建议大家借鉴。它认为,需要在干活前先知道这个整数有几位。剩下的代码实现也是非常繁琐,咋一看也许不知所云,甚至将输出的语句也写在了函数体内而非main函数内,这也是不太好的风格。反例的目的正是希望大家不要模仿,仅作鞭尸作用。因而大家不必细看,知道这样做并不好就可以了。


四、总结


本文通过牛客网引例“如何反向输出一个四位数”,介绍了“拨”出一个整数各个数位的四种思路。并以思路二循环取数为基础,展示了一道拓展例题。总体难度不大,各种方法有利有弊,需要诸位根据实际情况自行取舍使用。


如有其它方法,欢迎各位一同学习讨论!



相关文章
|
23天前
|
缓存 C语言
“拨”出数位上的数字 - 多种思路实现反向输出一个四位数(一)
本文介绍了编程中一个经典的入门题目——反向输出X位数,特别是以反向输出四位数为例,探讨了多种实现方法。这些方法包括使用取模运算分别获取数位、循环取数、利用scanf的宽度控制以及使用数组。每种方法都有其特点,适用于不同的场景。文章旨在帮助初学者拓宽编程思路,并鼓励读者讨论和分享更多实现方式。
43 0
|
23天前
|
算法 C语言
(“拨”取数字的典例:N位水仙花数判断及水仙花数变种)
这篇内容介绍了如何判断和生成水仙花数,水仙花数是一个n位数,其各位数字的n次方之和等于该数本身。文章首先回顾了"拨数"的概念,然后通过实例展示了如何判断三位水仙花数,并将其推广到任意位数的水仙花数。作者提供了详细的解题思路和代码示例,强调了解决这类问题时要慢下来,分步骤分析问题。最后,文章还探讨了一个水仙花数的变种问题,即数字拆分后乘积之和等于原数的情况。
30 0
|
30天前
|
C++
41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少
41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少
28 0
|
8月前
|
算法
【算法挨揍日记】day05——209. 长度最小的子数组、3. 无重复字符的最长子串
题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
340 0
|
10月前
|
算法 测试技术
算法强化每日一题--字符串中找出连续最长的数字串
算法强化每日一题--字符串中找出连续最长的数字串
|
算法 C语言
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
|
人工智能 图计算
LeetCode--缺失的第一个正数(41)和 接雨水(42)
LeetCode--缺失的第一个正数(41)和 接雨水(42)
47 0
|
算法 JavaScript 前端开发
算法简单题,吾辈重拳出击 - 前 n 个数字二进制中 1 的个数
最近做的题,明眼人一看都能知道大都和动态规划 DP 有关,因为就是从动态规划分类下抽取的简单题,有的题在剑指 offer 系列中是简单题,但是在力扣主列表里确实中等难度的题目。 简单与难,也并非是绝对的,每个人的感受都会不同。更重要的是,通过这些题构建基础的算法思路,建立信心。