计算数字位数

背景

早就想知道怎么实现了,今天恰好碰到了这个题:

判断一个整型数据有几位v2.0
从键盘输入一个整型数据(int型),用switch语句和循环语句编写程序判断该整数共有几位,并输出包含各个数字的个数。例如,从键盘输入整数16644,该整数共有5位,其中有1个1,2个6,2个4。
程序运行结果示例1:
Please enter the number:
12226↙
12226: 5 bits
1: 1
2: 3
6: 1
程序运行结果示例2:
Please enter the number:
-12243↙
-12243: 5 bits
1: 1
2: 2
3: 1
4: 1
输入格式: “%d”
输出格式:
输入提示信息:”Please enter the number:\n”
判断该整数共有几位:”%d: %d bits\n”
包含数字0的个数:”0: %d\n”
包含数字1的个数:”1: %d\n”
包含数字2的个数:”2: %d\n”
包含数字3的个数:”3: %d\n”
包含数字4的个数:”4: %d\n”
包含数字5的个数:”5: %d\n”
包含数字6的个数:”6: %d\n”
包含数字7的个数:”7: %d\n”
包含数字8的个数:”8: %d\n”
包含数字9的个数:”9: %d\n”

我写的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stdio.h>
#include <math.h>
int main()
{
int num, current;
int i;
int zero = 0, one = 0, two = 0, three = 0, four = 0, five = 0, six = 0, seven = 0, eight = 0, nine = 0;
printf("Please enter the number:\n");
scanf_s("%d", &num);
current = fabs(num);
for (i = 1;;i++) {
switch (current % 10) {
case 0:
zero++;
break;
case 1:
one++;
break;
case 2:
two++;
break;
case 3:
three++;
break;
case 4:
four++;
break;
case 5:
five++;
break;
case 6:
six++;
break;
case 7:
seven++;
break;
case 8:
eight++;
break;
case 9:
nine++;
break;
}
current = current / 10;
if (current == 0) {
printf("%d: %d bits\n", num, i);
break;
}
}
if (zero != 0) {
printf("0: %d\n", zero);
}
if (one != 0) {
printf("1: %d\n", one);
}
if (two != 0) {
printf("2: %d\n", two);
}
if (three != 0) {
printf("3: %d\n", three);
}
if (four != 0) {
printf("4: %d\n", four);
}
if (five != 0) {
printf("5: %d\n", five);
}
if (six != 0) {
printf("6: %d\n", six);
}
if (seven != 0) {
printf("7: %d\n", seven);
}
if (eight != 0) {
printf("8: %d\n", eight);
}
if (nine != 0) {
printf("9: %d\n", nine);
}

return 0;
}

还是屎山代码~~,我怎么只会这么写!

问题解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <math.h>

int main()
{
int num, current;
int i;
int count[10] = { 0 };

printf("Please enter the number:\n");
scanf_s("%d", &num);
current = fabs(num);

for (i = 1;; i++) {
count[current % 10]++;
current = current / 10;
if (current == 0) {
printf("%d: %d bits\n", num, i);
break;
}
}

for (i = 0; i < 10; i++) {
if (count[i] != 0) {
printf("%d: %d\n", i, count[i]);
}
}

return 0;
}

看看我自己写的80行,AI写的才30行
利用数组 代替10个单独变量,大幅简化代码
我们可以把数组想象成一排 “小盒子”,每个盒子都有一个编号(就是[]里的数字,叫 “下标”),盒子里可以放一个值。
以代码里的count[10]为例:

  • 它有 10 个小盒子,编号是09注意 :数组下标从 0 开始,不是 1)。
  • 每个盒子专门用来记一个数字出现的次数:count[0]记数字 0 出现几次,count[1]记数字 1 出现几次……count[9]记数字 9 出现几次。

举个生活例子:假设你在统计班级同学的生日月份,1 月到 12 月。你可以准备 12 个盒子,编号 1 到 12。

  • 有人说 “我 1 月生日”,就往编号 1 的盒子里放 1 个小球。
  • 又有人说 “我 1 月生日”,再往编号 1 的盒子里放 1 个小球(现在里面有 2 个)。
  • 有人说 “3 月生日”,往编号 3 的盒子里放 1 个小球……

这里的 “盒子编号” 就相当于数组的[]里的下标,“盒子里的小球数量” 就是数组元素的值。

总结

  • 计算输入的数字有几位时写的代码很好
  • 但因为不会数组,导致自己写的计算数字出现的次数的代码的时候极为复杂