“拨”出数位上的数字 - 多种思路实现反向输出一个四位数(一)+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函数内,这也是不太好的风格。反例的目的正是希望大家不要模仿,仅作鞭尸作用。因而大家不必细看,知道这样做并不好就可以了。
四、总结
本文通过牛客网引例“如何反向输出一个四位数”,介绍了“拨”出一个整数各个数位的四种思路。并以思路二循环取数为基础,展示了一道拓展例题。总体难度不大,各种方法有利有弊,需要诸位根据实际情况自行取舍使用。
如有其它方法,欢迎各位一同学习讨论!