找出每个数字出现的次数?

时间:2016-12-04 11:36:52

标签: c

  

写一个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()吗?

2 个答案:

答案 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);
    } 
}

这是一个用于此目的的简单代码。

  1. 我使用num > 0作为停止循环执行的条件。

  2. 我将num的剩余部分除以10 num % 10,然后递增对应于此余数(arr[num % 10]++)的数组中的计数值。

  3. 然后我将num除以10。然后循环重复,直到条件不满意为止。

  4. 然后我就打印了这些值。

  5. 修改: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

仔细看看,如果您有任何其他问题,请告诉我。