Это мой код. Предполагается сканировать 2 числа (m и n) в первой строке. Затем он должен сканировать массивы размером n. Затем он должен проверить числа (от 1 до m), существуют ли они во второй строке или нет. Если они не существуют, он должен напечатать числа.
#include <stdio.h>
int main()
{
int m = 0;
int n;
int i , j;
int x[100];
scanf("%d", &m);
scanf("%d", &n);
for(i = 0 ;i < n;i++)
{
scanf("%d", &x[i]);
}
for(j = 1;j <= m;j++)
{
for(i = 0; i < n;i++)
{
if (x[i] != j)
{
printf("%d", j);
}
}
}
}
например:
input :
3 3
1 2 4
output:
4
Он печатает неправильные числа. Я ожидал, что он напечатает номер 4. Но он печатает 1122333.
if (x[i] != j)
, вероятно, не то, что вы хотели...
Вам нужно перебрать все значения, чтобы убедиться, что j
не существует в массиве, прежде чем вы напечатаете, что оно отсутствует.
@JonathanLeffler Как я могу это сделать?
Удалите печать из внутренней петли. Установите флаг в 0 перед циклом; когда вы найдете значение в цикле, установите флаг в 1 и прервите. После цикла, если флаг не установлен, выведите j
.
Другие проблемы: всегда проверяйте возвращаемое значение scanf
. (Многие функции имеют код возврата, который сообщит вам, было ли это успешно или нет, поэтому вы должны проверить его.) Ваш формат printf
не содержит пробела или новой строки, поэтому все числа печатаются без разделения. 1122333
на самом деле 1
1
2
2
3
3
3
.
@JonathanLeffler Можете ли вы опубликовать ответ, пожалуйста?
#include <stdio.h>
#include <stdbool.h>
int main()
{
int m = 0;
int n;
int i, j;
int x[100];
bool exists[100] = { false }; // initialize all values to false
scanf("%d", &m);
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &x[i]);
exists[x[i]-1] = true; // mark the number as existing in the array
}
for(j = 1; j <= m; j++)
{
if (!exists[j-1]) // if the number doesn't exist in the array
{
printf("%d ", j);
}
}
printf("\n"); // add a newline at the end
return 0;
}
Сначала отсканируйте значения m
и n
. Затем отсканируйте массив из n
элементов. Если число не присутствует в массиве, напечатайте число и продолжите со следующим числом.
Вам нужно изменить внутренний цикл ur
#include <stdio.h>
int main() {
int m, n;
int x[100];
scanf("%d", &m);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &x[i]);
}
for (int i = 1; i <= m; i++) { // loop over the numbers 1 to m
int found = 0;
for (int j = 0; j < n; j++) { // loop over array x to check if i is present
if (x[j] == i) {
found = 1;
break;
}
}
if (!found) { // if i was not found in array x, print it to output
printf("%d ", i);
}
}
return 0;
}
Выдает ошибку времени выполнения. Я не мог это исправить.
У меня это работает — плюс-минус добавление putchar('\n'):
перед return 0;
. Код должен проверять, что scanf()
работает должным образом, но это уточнение.
@JonathanLeffler, вы можете изменить мой код..... для лучших результатов
Не нужно — то, что вы написали, работает. Мне просто не нравится, что приглашение командной строки появляется в той же строке, что и последняя строка вывода программы, поэтому я напечатал новую строку после цикла.
я вижу, что другой ответ был принят автором этого вопроса, может быть, это лучшее решение
вы прошли код в отладчике или добавили больше операторов printf?