Задать вопрос
@viperrrrr

Не могу решить задачу на C?

Даны целочисленные массивы А(M), В(N), причём А[0] ≤ А[1] ≤ ... ≤ А[M-1] и В[0] ≤ В[1] ≤ ... ≤ В[N-1]. Сформируйте массив С(M+N), содержащий все элементы массивов А и В, в котором С[0] ≤ С[1] ≤ ... ≤ С[M+N-1].

Формат входных данных. [M] [1-й элемент массива A] [2-й элемент массива A] и т.д. [1-й элемент массива B] [2-й элемент массива B] и т.д. Элементы массивов – целые числа в диапазоне ± 1000. M и N - целые числа в диапазоне [2, 20].

Формат выходных данных. [1-й элемент массива С] [пробел] [2-й элемент массива С] и т.д.
Рекомендуемое кол-во циклических операторов (без ввода и вывода данных): 1

вот мой код.

#define _CRT_SECURE_NO_WARNINGS


#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]; // M + N <= 40 тк максимальный размер массива A и массива В по 20
    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++;
    }

    // Вывод массива C
    for (int i = 0; i < M + N; i++) {
        printf("%d ", C[i]);
    }
    printf("\n");

    return 0;
}
  • Вопрос задан
  • 116 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Если проблема только с тем, что у вас циклов слишком много, то можно 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++];
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы