застрял на этом C-коде

#c #unix

#c #unix

Вопрос:

ХОРОШО, итак, цель этого кода — запросить у пользователя целое число, после чего программа распечатает каждую цифру 0-9 и номер вхождения в предоставленный пользователем номер. вывод должен выглядеть примерно так

 Enter a number: 28666

0 is repeated 0 times.
1 is repeated 0 times.
2 is repeated 1 times.
3 is repeated 0 times.
4 is repeated 0 times.
5 is repeated 0 times.
6 is repeated 3 times.
7 is repeated 0 times.
8 is repeated 1 times.
9 is repeated 0 times.
  

вот мой код и вывод на данный момент.

 #include <stdbool.h> 
#include <stdio.h>

int main(void)
{ 
    bool digit_seen[10] = {false};
    int digit;
    long n;


    printf("Enter a number: ");
    scanf("%ld", amp;n);
    while (n > 0) {
      digit = n % 10;
      if (digit_seen[digit])
        break;
      digit_seen[digit] = true;
      n /= 10;
    }

    if (n > 0)
      for(int i=0; i<digit; i  )
        digit_seen[i]  ;
      for(int i=0; i<digit; i  )
        printf(" %d is occur %d times n",i,digit_seen[i]);
    if (n < 0)
      printf("No repeated digitn");
    return 0;
}
  

вот мой вывод

 Enter a number: 147795655                                                                                                                                       
 0 is occur 1 times                                                                                                                                             
 1 is occur 1 times                                                                                                                                             
 2 is occur 1 times                                                                                                                                             
 3 is occur 1 times                                                                                                                                             
 4 is occur 1 times  
  

как вы можете видеть, я не получаю нужный мне результат, и я не понимаю, почему.Если бы кто-нибудь мог помочь мне понять, где я ошибаюсь, это было бы большой помощью, спасибо.

Комментарии:

1. bool digit_seen[10] = {false}; —> int digit_seen[10] = {0}; . Помните: вы подсчитываете вхождения, как в digit_seen[i] ; .

2. Отрицательным числам не разрешается повторять цифры? Почему последний if(...) используется для?

Ответ №1:

Вы используете bool значения для хранения того, какие цифры существуют, а какие нет, но если вы хотите подсчитать, сколько раз появлялась каждая цифра, вам нужно будет использовать int вместо bool .

Итак, определите digit_seen как:

 int digit_seen[10] = {0};
  

И измените цикл, в котором вы вычисляете количество цифр, на это:

 while (n > 0) {
    digit = n % 10;
    digit_seen[digit]  ;
    n /= 10;
}
  

И после этого вы можете просто распечатать digit_seen массив следующим образом:

 for (int i = 0; i < 10; i  ){
    printf(" %d is occur %d times n",i,digit_seen[i]);
}
  

Редактировать:

Смотрите предлагаемый код в действии здесь.

Ответ №2:

Вам нужны два цикла — один для подсчета, а другой для распечатки подсчетов.

Поскольку в вашем ожидаемом выводе перечислены все цифры, вам не нужен отдельный digit_seen цикл. Вы можете просто разложить число с n помощью и n/10 , как вы это делали, и увеличивать digit_count[digit] по мере продвижения. Вам нужно добавить специальный регистр для нуля, потому что это условие выхода вашего цикла.

Ответ №3:

На двух

 for(int i=0; i<digit; i  ) 
  

digit — это просто последнее значение, полученное в цикле while, то есть первая цифра числа. Кроме того, значение n, выходящее из while, всегда будет равно 0, поэтому никогда не вводите

  if (n > 0)
  for(int i=0; i<digit; i  )
    digit_seen[i]  ;
  

ни в

  if (n < 0)
  printf("No repeated digitn");
  

Так что просто введите

  for(int i=0; i<digit; i  )
   printf(" %d is occur %d times n",i,digit_seen[i]);
  

а затем показывает, присутствует ли цифра или нет в исходном n-ном номере, как показано в вашем результате.
Вам следует пересмотреть свой алгоритм.

Ответ №4:

Ваша главная ошибка в том, что вы пытаетесь увеличить элементы логического массива «bool digit_seen [10]». Почему бы вам не попробовать это:

  • Объявите целочисленный массив [10], инициализированный нулями. Каждый индекс массива будет представлять цифру, а его значение будет представлять его частоту.
  • На каждой итерации цикла while digit = n, а затем n = n / 10.
  • Каждый раз, когда вы делаете это, увеличивайте соответствующее значение в вашем массиве на единицу (например, array [digit] ).
  • Затем все, что вам нужно сделать, это распечатать частоты соответствующих цифр (иначе индексов массива).