Подсчитать количество вхождений цифры в строку

Итак, я пытаюсь подсчитать количество вхождений каждой цифры в массиве.

Мой код, который у меня есть до сих пор, выглядит следующим образом:

#include <stdio.h>
#include <string.h>

int main()
{
  int numbers [10]= {1, 4, 5, 5, 5, 6, 6, 3, 2, 1};
  int count = 0;

  for(int i = 0; i < 10; i++)
  {
    for (int j = 0; j < 10; j++)
    {
      if (numbers[i] == numbers[j])
      {
        count++;
      }
    }
    printf("Number %d has occured %d many times \n", numbers[i], count);
    count = 0;

  }
} 

Только вывод, который я получаю, следующий:

Number: 1       Occurence: 2
Number: 4       Occurence: 1
Number: 5       Occurence: 3
Number: 5       Occurence: 3
Number: 5       Occurence: 3
Number: 6       Occurence: 2
Number: 6       Occurence: 2
Number: 3       Occurence: 1
Number: 2       Occurence: 1
Number: 1       Occurence: 2 

Я только хочу подсчитать появление КАЖДОЙ цифры, похоже, она подсчитывает дубликаты.

Как я могу исправить этот код? Может ли кто-нибудь указать мне в правильном направлении.

Большое спасибо

Алонсо


person AlonsoM    schedule 07.12.2013    source источник
comment
Это на каком языке? С? С++? Что-то другое?   -  person The Guy with The Hat    schedule 08.12.2013
comment
Пожалуйста, отметьте соответствующий язык в своем вопросе. Я пришел сюда, ожидая Java, и был, к сожалению, разочарован.   -  person Andrew Gies    schedule 08.12.2013
comment
Учитывая синтаксис включения, я бы предположил, что C   -  person drew_w    schedule 08.12.2013
comment
В C строка представляет собой непрерывную последовательность символов, заканчивающуюся первым нулевым символом и включающую его. int numbers [10] не является такой строкой.   -  person chux - Reinstate Monica    schedule 08.12.2013


Ответы (2)


Рассмотрим этот модифицированный код:

#include <stdio.h>
#include <string.h>

int main()
{
  int numbers [10]= {1, 4, 5, 5, 5, 6, 6, 3, 2, 1};
  int count = 0;

  for(int i = 0; i < 10; i++) { //i = current digit
    for (int j = 0; j < 10; j++) { //j = index in array
      if (i == numbers[j]) {
        count++;
      }
    }
    printf("Number %d has occured %d times \n", i, count);
    count = 0;
  }
}

Выход:

Number 0 has occured 0 times 
Number 1 has occured 2 times 
Number 2 has occured 1 times 
Number 3 has occured 1 times 
Number 4 has occured 1 times 
Number 5 has occured 3 times 
Number 6 has occured 2 times 
Number 7 has occured 0 times 
Number 8 has occured 0 times 
Number 9 has occured 0 times 

Вы подсчитывали, как часто встречается каждая цифра в массиве (включая повторяющиеся цифры в массиве).

person Uli Köhler    schedule 07.12.2013
comment
Спасибо. Я видел, где я ошибся. Я знал, что это будет простой ошибкой. Ваше здоровье - person AlonsoM; 08.12.2013
comment
Без проблем! Пожалуйста, отметьте ответ как правильный, чтобы другие могли найти правильное решение, если у них возникнет похожая проблема! Примечание. Если вы хотите игнорировать цифры с нулевым счетом, заключите printf() в if(count == 0) {} - person Uli Köhler; 08.12.2013
comment
Рассмотрим int count = 0; между 2 for(...). - person chux - Reinstate Monica; 08.12.2013
comment
@chux: я согласен, что это было бы лучшим решением, однако я намеревался как можно меньше изменить исходный код. - person Uli Köhler; 08.12.2013

Вам понадобятся массивы — один для подсчета (результата) и один для ввода. Вы должны увеличивать индекс в массиве count по мере того, как вы перебираете входные числа. Я не мог удержаться от того, чтобы написать код, так что вот, следующее должно работать IN C++

#include <stdio.h>
#include <string.h>

int main()
{
  int inputNumbers [] = {1, 4, 5, 5, 5, 6, 6, 3, 2, 1};
  int resultCount [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int countNumbers = sizeof(inputNumbers) / sizeof(inputNumbers[0]);

  for(int i = 0; i < countNumbers; i++)
  {
     resultCount[inputNumbers[i]]++;
  }

  for(int i = 0; i < countNumbers; i++)
  {
    printf("Number %d has occured %d times \n", i, resultCount[i]);
  }
}

Надеюсь, это поможет.

person drew_w    schedule 07.12.2013