Чередование массивов в C - PullRequest
0 голосов
/ 06 октября 2018

Я опубликовал ранее, но я не правильно отформатировал или добавил свой код.Скажем, у меня есть массив int x = [1,2,3].Учитывая значение i, я хочу создать массив x ^ i, такой, что если i = 3, массив x ^ i = [1,1,1,2,2,2,3,3,3].Если i = 5, массив x ^ i = [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4, 5,5,5,5,5].Я динамически распределяю память для этого.

Однако мой код для i = 3 создает массив = [1,2,3,1,2,3,1,2,3].Я пробовал много разных вещей, и я получил что-то вроде [1,1,1,1,1,1,1,1,1] или [3,3,3,3,3,3,3,3,3], но никогда не правильный ответ.

Вот мой код:

void binary_search(int size_a, int * A, int size_x, int *X, int max_i, int min_i){

    int i, j, k, count = 0, max_repeat = 0;

    while(min_i <= max_i){

    int repeats = (max_i + min_i)/2;

    int * temp = realloc(X, size_x * sizeof(int) * repeats);
    X = temp;


    for(k = 0; k < size_x; ++k){
    int idx = size_x - k -1;
    temp = &X[idx];
        for(j = 0; j < repeats; ++j){
            X[idx * repeats + j] = *temp;
        }
    }

    printf("New X: ");
        for(i = 0; i < size_x * repeats; i++){
            printf("%d ", X[i]);
        }

    int count = 0;
    for(i = 0; i < size_x * repeats; i++){
        for(j = 0; j < size_a; j++){
            if(A[j] == X[i]){
                count++;
                i++;
            }
        }
    }

    if (count == size_x * repeats){
        printf("Low: %d Mid %d High % d Passes\n", min_i, repeats, max_i);
        min_i = repeats + 1;
    }
    else
        printf("Low: %d Mid %d High % d Fails\n", min_i, repeats, max_i);
        max_i = repeats - 1;
    }

}

Повторяющаяся переменная представляет значение i в x ^ i.

Вывод это:

Old X: 1 2 3 

New X: 1 1 1 2 2 2 3 3 3 Low: 0 Mid 3 High  6 Fails

New X: 1 1 1 Low: 0 Mid 1 High  2 Fails

New X: Low: 0 Mid 0 High  0 Fails

Первая итерация верна, однако вторая итерация не должна быть [1,1,1], она должна быть [1,2,3].

Гдея ошибаюсь?

1 Ответ

0 голосов
/ 06 октября 2018

Вот, пожалуйста,

int misleading_function_names_is_bad_practice(size_t xsize, int x[xsize], size_t i)
{
    void * const tmp = realloc(x, xsize * sizeof(*x) * i);
    if (tmp == NULL) {
       return -__LINE__;
    }
     x = tmp;

     for (size_t k = 0; k < xsize; ++k) {
         // index of the last original digit counting down
         const size_t idx = xsize - k - 1;
         const int tmp = x[idx];
         for (size_t l = 0; l < i; ++l) {
              // fill from the back
              x[idx * i + l] = tmp;
         }
      }

      return 0;
}

Живой пример доступен на onlinegdb .

...