#c
#c
Вопрос:
Я пытаюсь решить проблему, цель состоит в том, чтобы напечатать, что последний шаг может быть достигнут, входные данные — N в виде тестовых наборов, а A — в виде целых чисел тестовых наборов. Например: N = 10 A = 1 2 1 1 2 3 4 1 2 3 <- 10 целые числа
Итак, это то, что я сделал.
#include <stdio.h>
int main()
{
int N,i,j;
scanf("%d",amp;N);
int A[N 1];
for(int i=0;i<N;i )
{
scanf("%d",amp;A[i]);
}
A[N] = 1;
for(int i=0;i<N;i )
{
if(A[i] > A[i 1])
{
printf("%d-",A[i]);
}
else if(A[i] == A[i 1])
{
printf("%d-",A[i]);
}
}
printf("n");
return 0;
}
Ожидаемый результат :
2-1-4-3
но результат, который я получаю: 2-1-4-3-
Как мне исключить символ минуса после последнего вывода? Заранее спасибо.
Ответ №1:
Лично я предпочитаю печатать символ разделителя раньше. Простая причина в том, что обычно это происходит в циклах, которые начинаются с нуля, поэтому я могу выполнить нулевой тест следующим образом:
for(int i = 0; i < N; i )
{
if (i > 0)
putc('-', stdout);
printf("%d", A[i]);
}
НО в вашем случае ваш цикл не всегда будет печатать значение. Так что вам действительно нужно быть умнее. Есть много способов добиться этого, но для простоты, почему бы просто не использовать флаг:
int has_output = 0;
for(int i = 0; i < N; i )
{
if(A[i] >= A[i 1])
{
if (has_output)
putc('-', stdout);
else
has_output = 1;
printf("%d", A[i]);
}
}
Обратите внимание, что предпочтение по-прежнему отдается своевременной печати разделителя. Другими словами, только тогда, когда вы определяете, что вам нужно что-то напечатать.
Становится немного более сумасшедшим:
const char* fmt[2] = { "%d", "-%d" };
int has_output = 0;
for(int i = 0; i < N; i )
{
if(A[i] >= A[i 1])
{
printf(fmt[has_output], A[i]);
has_output = 1;
}
}
Ответ №2:
#include<stdio.h>
int main()
{
int N,i,j;
scanf("%d",amp;N);
int A[N 1];
for(int i=0;i<N;i )
{
scanf("%d",amp;A[i]);
}
A[N] = 1;
int flag = 0; //added a new variable here
for(int i=0;i<N;i )
{
if(A[i] >= A[i 1])
{
if(flag == 0){ //check if its printing for the first time
printf("%d",A[i]); // then print without dash
flag = 1; //change the flag so that this block never executes again
}else{
printf("-%d",A[i] ); //else print a dash and then the number
}
}
}
printf("n");
return 0;
}
Ответ №3:
Поскольку "-"
разделитель используется только после первого напечатанного значения, рассмотрите возможность изменения разделителя.
const char *separator = "";
for(int i=0;i<N;i ) {
if(A[i] >= A[i 1]) {
printf("%s%d", separator, A[i]);
separator = "-";
}
}
printf("n");