Я недавно сделал код на C, который читает набор чисел до нуля (ноль заканчивает набор чисел) и печатает его префиксную сумму:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x, sum;
    sum = 0;
    while(x)
    {
        scanf("%d", &x);
        sum += x;
        if(x != 0)
        {
            printf("%d,", sum);    
        }
        else{
            break;
        }
    }
    return 0;
}

Если бы я напечатал 2 3 5 7 11 0: он напечатал бы следующее:

2,5,10,17,28,

Мне было интересно, как убрать запятую по номеру 28 или добавить запятые в числа до последнего номера?

c
0
DamagedSoul97 28 Фев 2018 в 05:23

5 ответов

Лучший ответ

Мое предпочтительное решение, адаптированное к коду в вопросе:

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

int main(void)
{
    int sum = 0;
    int x;
    const char *pad = "";   /* Or put a prefix here */
    while (scanf("%d", &x) == 1 && x != 0)
    {
        sum += x;
        printf("%s%d", pad, sum);
        pad = ",";          /* Or use ", " if you prefer */
    }
    putchar('\n');
    return 0;
}

Обратите внимание, что этот код не проверяет неинициализированную переменную x на первой итерации (в отличие от кода в вопросе), и проверяет, что scanf() завершается успешно, прежде чем использовать значение (в отличие от кода в вопросе). ) . Это обычные меры предосторожности, которые вы должны принимать. Можно было бы адаптировать код для отслеживания того, сколько байтов было напечатано в строке (каково возвращаемое значение из printf()?), И организовать pad для размещения "\n" ( вместо запятой или ",\n", если вам нужна запятая в конце всех строк, кроме последней), когда строка становится «слишком длинной».

Также обратите внимание, что если вы наберете цифры в программе, результат будет грязным. Если программа читает из встроенного списка чисел или читает из файла, то вы получите хорошие результаты.

2
Jonathan Leffler 7 Мар 2018 в 15:42

Вы можете использовать следующий подход:

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

int main()
{
    int x = 0;
    int sum = 0;
    int i = -1;
    int ret;

    while(1)
    {
        i++;
        ret = scanf("%d", &x);

        if(ret != 1)
          break;

        sum += x;

        if(x != 0)
        {
            if(i == 0) 
               printf("%d", sum);
            else
              printf(",%d", sum);
        }
        else
        {
            break;
        }
    }

    printf("\n");
    return 0;
}

Выход:

1
2
3
0
1,3,6
1
sg7 28 Фев 2018 в 03:14

Распечатайте запятую перед всеми, кроме первого значения. Это не элегантно, но работает.

if(x != 0)
{
    if(sum == x) // On the first pass, sum == x
        printf("%d", sum);
    else
        printf(",%d", sum);
}

Конечно, это может сломаться, если у вас есть отрицательные значения. В этом случае лучше хранить счетчик или бул.

0
Longarmx 28 Фев 2018 в 02:27

Всегда есть неуклюжий, но проверенный метод:

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

int main()
{
    int x, sum;
    sum = 0;
    comma = 0;
    while(x)
    {
        scanf("%d", &x);
        sum += x;
        if(x != 0)
        {
            if (comma != 0)
            {
                printf(",");
            }
            printf("%d", sum);
            comma = 1;
        }
        else{
            break;
        }
    }
    return 0;
}
0
Ozymandias 28 Фев 2018 в 02:42

Печатать запятую только после первой итерации (используйте пользовательский флаг), печатать результат независимо от того, что:

int first_iteration = 1;

...

if (!first_iteration)
{
   printf(",");
}
sum += x;
first_iteration = 0;
printf("%d", sum);
0
Jean-François Fabre 28 Фев 2018 в 02:39