#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] ).
- Затем все, что вам нужно сделать, это распечатать частоты соответствующих цифр (иначе индексов массива).