Печать суммы цифр больше среднего - PullRequest
0 голосов
/ 19 сентября 2019

Для назначения мне нужно написать код на C , который печатает цифры из числа, превышающего его среднее значение.

Я уже написал некоторый код, но когда явставьте одно число или число с одинаковыми цифрами (например, 555), это не даст мне ответа.Это должно дать, в случае 555 -> 5 (и 8 -> 8, 77 -> и т. Д.)

Код, который я написал:

(я прокомментировал вкаждый шаг, который я делаю.)

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *v[])  {
    /* imput: 1 number between 1 and 2.000.000.000 */
    int n;          /*  stores the value                            */
    int ext, ext2;  /*  stores a copy of the number                 */
    int rem;        /*  stores the remainders                       */
    int tot;        /*  stores the total of the digits              */
    int avg;        /*  stores the average of the digits            */
    int i;          /*  counts the amount of digits                 */
    int big;        /*  stores the biggest and second biggest value */

    scanf("%d", &n);

    /* seperate digits and add them */
    ext=n;
    ext2=n;
    tot=0;
    big=0;
    avg=0;
    i=0;

    while(ext!=0 && n<2000000000 && n>=1){
        rem=ext%10;
        tot=tot+rem;
        ext=ext/10;
        i++;
    };  

    /* average value */
    avg=tot/i;      

    /* find and print higher numbers */
    while (ext2>0){
        rem = ext2 % 10;
        if (rem > avg){
            big += rem;
        };
        ext2 = ext2 / 10;
    }

    if(n<100 && n>9){
        printf("%d\n", big);
    } else if(big==avg){
        printf("%d\n", 0);
    } else if(big>=avg){
        printf("%d\n", big);
    };

    return 0;
}

Надеюсь, кто-нибудь может мне помочь!

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Помимо невозможности инициализации 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.Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 20 сентября 2019

Вы забыли инициализировать переменную i с 0. Я исправил ваш код, и он дает ожидаемый результат.И ответ равен 0 для одного числа, потому что среднее число одного числа всегда само число, поэтому число никогда не больше среднего.

#include <stdio.h>
#include <stdlib.h>

int main ()
{
    /* imput: 1 number between 1 and 2.000.000.000 */
    int n;          /*  stores the value                            */
    int ext, ext2;  /*  stores a copy of the number                 */
    int rem, rem2;  /*  stores the remainders                       */
    long tot;       /*  stores the total of the digits              */
    int avg;        /*  stores the average of the digits            */
    int i;          /*  counts the amount of digits                 */
    int big, big2;  /*  stores the biggest and second biggest value */
    int sum;        /*  stores sum of digits greater than average   */
    scanf("%d", &n);

    /* seperate digits and add them */
    ext=n;
    ext2=n;
    tot=0;
    big=0;
    big2=0;
    avg=0;
    i=0;
    sum=0;

    while(ext!=0 && n<2000000000 && n>=1)
    {
        rem=ext%10;
        tot=tot+rem;
        ext=ext/10;
        i++;
    };

    /* average value */
    avg=tot/i;

    /* find and print higher numbers */

    while(ext2>0)
    {
        rem2=ext2%10;
        if(rem2>avg)
        {
            sum+=rem2;
        };
        ext2=ext2/10;
    };

    printf("sum of digits greater than average: %d",sum);

    return 0;
}
...