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

简介: ```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函数内,这也是不太好的风格。反例的目的正是希望大家不要模仿,仅作鞭尸作用。因而大家不必细看,知道这样做并不好就可以了。


四、总结


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


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



相关文章
|
6月前
|
缓存 C语言
“拨”出数位上的数字 - 多种思路实现反向输出一个四位数(一)
本文介绍了编程中一个经典的入门题目——反向输出X位数,特别是以反向输出四位数为例,探讨了多种实现方法。这些方法包括使用取模运算分别获取数位、循环取数、利用scanf的宽度控制以及使用数组。每种方法都有其特点,适用于不同的场景。文章旨在帮助初学者拓宽编程思路,并鼓励读者讨论和分享更多实现方式。
170 0
|
算法 测试技术
算法强化每日一题--字符串中找出连续最长的数字串
算法强化每日一题--字符串中找出连续最长的数字串
|
算法 C语言
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #
|
人工智能 图计算
LeetCode--缺失的第一个正数(41)和 接雨水(42)
LeetCode--缺失的第一个正数(41)和 接雨水(42)
66 0
每日三题-电话号码的字母组合、字母异位词分组、找到所有数组中消失的数字
每日三题 电话号码的字母组合 字母异位词分组 找到所有数组中消失的数字
109 4
每日三题-电话号码的字母组合、字母异位词分组、找到所有数组中消失的数字
|
存储 算法
【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字
思路:对于对于任意一个丑数 x,其与任意的质因数(2、3、5)相乘,结果(2x、3x、5x)仍为丑数。因此可以使用优先队列(小根堆)存放丑数x,每次从队列取出最小值x,并将x所对应的2x、3x和5x入队。第n次出队的值即为第n个丑数
255 0
【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字
|
索引
力扣刷题记录——748. 最短补全词、744. 寻找比目标字母大的最小字母、747. 至少是其他数字两倍的最大数
力扣刷题记录——748. 最短补全词、744. 寻找比目标字母大的最小字母、747. 至少是其他数字两倍的最大数
131 0
力扣刷题记录——748. 最短补全词、744. 寻找比目标字母大的最小字母、747. 至少是其他数字两倍的最大数
|
索引
力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干
力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干
120 0
力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干