У вас возникли трудности с решением задачи на языке C?

Даны два целочисленных массива A (размером M) и B (размером N), причем элементы массива A упорядочены по возрастанию (A[0] ≤ A[1] ≤ ... ≤ A[M-1]) и элементы массива B также упорядочены (B[0] ≤ B[1] ≤ ... ≤ B[N-1]). Необходимо сформировать новый массив C (размером M+N), который будет содержать все элементы из массивов A и B, упорядоченные по возрастанию (C[0] ≤ C[1] ≤ ... ≤ C[M+N-1]). 

Формат входных данных: сначала идет значение M, после чего перечисляются элементы массива A, затем значение N, за которым следуют элементы массива B. Элементы массивов - целые числа в диапазоне от -1000 до +1000. Значения M и N варьируются от 2 до 20. 

Формат выходных данных: массив C должен быть выведен в виде последовательности элементов, разделенных пробелом. Рекомендуется использовать не более одного циклического оператора (без учета ввода и вывода данных).

Вот мой код: 
<pre><code class="cpp">#define _CRT_SECURE_NO_WARNINGS

#include &lt;stdio.h&gt;

int main() {
    int M, N;

    // Чтение размера массива A
    scanf("%d", &amp;M);

    // Чтение массива A
    int A[20]; 
    for (int i = 0; i &lt; M; i++) {
        scanf("%d", &amp;A[i]);
    }

    // Чтение размера массива B
    scanf("%d", &amp;N);

    // Чтение массива B
    int B[20]; 
    for (int i = 0; i &lt; N; i++) {
        scanf("%d", &amp;B[i]);
    }

    // Инициализация массива C
    int C[40]; // M + N &lt;= 40 тк максимальный размер массива A и массива В по 20
    int i = 0, j = 0, k = 0;

    // Формирование массива C
    while (i &lt; M &amp;&amp; j &lt; N) {
        if (A[i] &lt;= B[j]) {
            C[k] = A[i];
            i++;
        }
        else {
            C[k] = B[j];
            j++;
        }
        k++;
    }

    // Добавление оставшихся элементов из A, если они есть
    while (i &lt; M) {
        C[k] = A[i];
        i++;
        k++;
    }

    // Добавление оставшихся элементов из B, если они есть
</code></pre>
  • 18 марта 2025 г. 12:44
Ответы на вопрос 2
Ваш код почти готов, но в нём не хватает части для добавления оставшихся элементов из массива B. Давайте дополним ваш код, а также исправим некоторые синтаксические ошибки, связанные с HTML-кодировкой символов ("&lt;" и "&amp;"). Ниже представлен исправленный и завершённый код на языке C:

```c
#include <stdio.h>

int main() {
    int M, N;

    // Чтение размера массива A
    scanf("%d", &M);

    // Чтение массива A
    int A[20]; 
    for (int i = 0; i < M; i++) {
        scanf("%d", &A[i]);
    }

    // Чтение размера массива B
    scanf("%d", &N);

    // Чтение массива B
    int B[20]; 
    for (int i = 0; i < N; i++) {
        scanf("%d", &B[i]);
    }

    // Инициализация массива C
    int C[40]; // Массив C будет максимального размера M + N (до 40)
    int i = 0, j = 0, k = 0;

    // Формирование массива C
    while (i < M && j < N) {
        if (A[i] <= B[j]) {
            C[k] = A[i];
            i++;
        } else {
            C[k] = B[j];
            j++;
        }
        k++;
    }

    // Добавление оставшихся элементов из A, если они есть
    while (i < M) {
        C[k] = A[i];
        i++;
        k++;
    }

    // Добавление оставшихся элементов из B, если они есть
    while (j < N) {
        C[k] = B[j];
        j++;
        k++;
    }

    // Вывод результата
    for (int idx = 0; idx < k; idx++) {
        printf("%d ", C[idx]);
    }

    return 0;
}
```

### Разбор изменений:

1. **Добавление элементов из массива B**: После основного цикла, в который вы добавляете элементы из A и B, добавлен цикл для включения оставшихся элементов из массива B, если они остались.

2. **Корректное использование операторов**: Убедитесь, что все строки кода имеют правильный синтаксис, без HTML-кодировки.

3. **Вывод массива C**: После формирования массива C добавлен цикл для его вывода.

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

Вы при каком условии должны числа дописывать в ответ? Пока есть число хоть в одном из двух массивов.
Вот и получается:
while (i < M || j < N)
Но внутри уже чуть побольше случаев. Можно просто ваши же условия объединить. Если выполняется условие первого цикла - делаете тело первого цикла. Иначе, проверяете условие второго цикла, делаете его, иначе - тело третьего цикла.

Но можно знатно сократить код, если просто расписать все варианты, когда вы берете число из A. В противном случае, очевидно, берется число из B. Число из A берется, если оно есть и оно "лучше" числа из B - или B вообще нет, или A < B:
if (i < M && (j == N || A[i] < B[j])) {
  C[k++] = A[i++];
} else {
  C[k++] = B[j++];
}
Похожие вопросы