Помимо невозможности инициализации i = 0;
до i++;
, вашей самой большой проблемой является то, что вы путаете себя с большим количеством ненужных и неописуемых имен переменных.ext, ext2, tot, big, big2, avg, rem, rem2
- это просто переменный салат.
Хотя вам понадобится ext2
, чтобы хранить копию переменной, которую вы уменьшаете на %
(по модулю), чтобы найти tot
и avg
, но нетнужно для rem2
или big2
(вы можете просто повторно использовать rem
), и вам нужен только один big
(при условии, что ваша переменная содержит сумму цифр больше avg
)
ДалееВаш цикл поиска big
(и использование big2
) значительно более запутан, чем это необходимо.Вам все равно, если rem2
больше big2
, а затем установить big2 = rem2;
, что вас волнует, будет ли цифра больше avg
.(это все) Все, что вам нужно:
/* find and print higher numbers */
while (ext2>0){
rem = ext2 % 10;
if (rem > avg){
big += rem;
};
ext2 = ext2 / 10;
}
Теперь big
содержит сумму цифр, превышающую средние значения.
Повторное использование переменных и использование описательных имен переменных будет иметь большое значение длясохраняя свою логику и предотвращая ненужное разрастание переменных.При написании функций следует иметь в виду обычное эмпирическое правило (всегда полезно помнить), но если вы пишете функцию и используете более 4 переменных, вам может потребоваться рефакторингваша программа.(это не жесткое правило, но суть в том, чтобы предотвратить именно тот салат, в который вы попали)
Почему long tot;
?Самое большее 1+9+9+9+9+9+9+9+9+9 = 82
.Использование int
, как вы используете для остальных ваших переменных, это нормально.(учитывая ваше ограничение, что 1≤n<2000000000
)
Наконец, хотя вы можете взять ввод численно, как у вас, и использовать модуль для извлечения каждой цифры, было бы намного проще просто прочитать ввод как строку, а затемпросто итерируйте по каждому символу, вычитая '0'
, чтобы получить числовое значение (как это предлагается в комментариях Weather Vane)
Редактировать приведение в порядок переменных
Из нашего дальнейшего обсужденияЯ решил отказаться от быстрого редактирования, которое немного упростит остальную часть кода и уменьшит количество переменных, а также инициализирует переменные, когда они будут объявлены.Вы можете сделать что-то похожее на:
#include <stdio.h>
int main (void) {
int n, /* stores the value */
tmp, /* stores a copy of the number */
rem, /* stores the remainders */
tot = 0, /* stores the total of the digits */
avg = 0, /* stores the average of the digits */
digits = 0, /* counts the number of digits */
big = 0; /* stores the sum of digits larger than avg */
/* imput: 1 number (1 <= n && n <= 2.000.000.000 */
if (scanf("%d", &n) != 1) { /* read/validate number */
fputs ("error: invalid integer input.\n", stderr);
return 1;
}
if (n < 1 || 2000000000 < n) { /* validate n in allowable range */
fputs ("error: input outside allowable value.\n", stderr);
return 1;
}
tmp = n;
while (tmp) { /* sum digits for average */
rem = tmp % 10;
tot += rem;
tmp /= 10;
digits++;
}
avg = tot / digits; /* calculate average */
tmp = n;
while (tmp) { /* sum numbers higher than avg */
rem = tmp % 10;
if (rem > avg)
big += rem;
tmp /= 10;
}
printf ("sum of digits greater than avg : %d\n", big);
}
Ничего особенного, кроме 989 -> 18
, 777 -> 0
и 778 -> 8
.Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.