写一个C函数计数位数(int num);其中num是正整数。该函数计算每个数字0..9出现在num中的次数,并打印结果(每个都在一个新行上。)例如:
The digit 0 appeared 0 time(s) in 347213
The digit 1 appeared 1 time(s) in 347213
.....
使用迭代
int count_digits(int num){
int counter = 0;
int nDigits = floor(log10(abs(num))) + 1;
for(int i=0; i < nDigits; i++){
// How do I get each char of the integer?
}
}
我遇到的主要问题是分析每个字符。我使用getchar()
吗?
答案 0 :(得分:2)
void count_digits(int num) {
int i, arr[10] = {0}, e = num;
if (num == 0) arr[0]++;
else if (num < 0) num *= (-1);
while (num > 0) {
arr[num % 10]++;
num /= 10;
}
for (i = 0; i < 10; i++) {
printf("%d appears %d times in %d\n", i, arr[i], e);
}
}
这是一个用于此目的的简单代码。
我使用num > 0
作为停止循环执行的条件。
我将num
的剩余部分除以10 num % 10
,然后递增对应于此余数(arr[num % 10]++
)的数组中的计数值。
然后我将num
除以10
。然后循环重复,直到条件不满意为止。
然后我就打印了这些值。
修改:arr[10] = {0}
使用arr
s初始化大小为10
的数组0
。
编辑2:if(num == 0) arr[0]++
。此行检查数字输入是否为0,如果等于arr
0
中的计数
编辑3:根据@ chux的建议,我做了必要的修改,以便函数甚至处理负数。
答案 1 :(得分:2)
有多种方法可以确定数字中各个数字的频率。很多时候,处理 sting 格式的数字同样容易,而不是自己的数字。确定频率的方法在每种情况下都是相同的,因此请将您的例程与您正在处理的数据类型相匹配。
下面的简短示例,只需使用mod
循环,从传递给ndigits()
函数的任何数字中提取数字。由于您只关心数字的频率,因此不会像典型的转换过程那样重新排序分隔的数字。将零初始化频率数组作为参数传递给函数,在函数内,只需更新与遇到的数字相对应的元素。返回时,数组包含传递为“n”的数字中每个数字的每位数频率:
#include <stdio.h>
#include <stdlib.h> /* for atoi */
#define NDIG 10 /* array size to hold frequency of digits (0-9) */
int ndigits (int n, int *a);
int main (int argc, char **argv) {
int a[NDIG] = {0}; /* initialize freq array to all 0 */
int n = argc > 1 ? atoi (argv[1]) : 347213, /* set number */
nd = ndigits (n, a); /* get number of digits/set freq */
printf (" the frequency of digits in '%d' (%d digits):\n\n", n, nd);
printf (" digits | frequency\n--------+---------\n");
for (int i = 0; i < NDIG; i++) /* output elements of freq array */
printf (" %6d | %2d\n", i, a[i]);
return 0;
}
/* record the frequency of digits in 'n' in array 'a' */
int ndigits (int n, int *a)
{
int d = 0;
for (; n; n /= 10, d++)
a[n % 10]++;
return d;
}
示例使用/输出
$ ./bin/freq_digits
the frequency of digits in '347213' (6 digits):
digits | frequency
--------+---------
0 | 0
1 | 1
2 | 1
3 | 2
4 | 1
5 | 0
6 | 0
7 | 1
8 | 0
9 | 0
仔细看看,如果您有任何其他问题,请告诉我。