Данный код предназначен для массива вращения для данного ключа. - PullRequest
0 голосов
/ 24 февраля 2019

В приведенном ниже коде (скажем, n = 5) последние два индекса массива 'b' (то есть b [4], b [5]) показывают значение мусора. Почему это так?
samplei / p = [1 2 3 4 5], k = 2 o / p = [3 4 5 1 2]

void main() {
    int i, j = 0, n, a[1000], b[1000], k, t, c = 0;
    scanf("%d", &n);    // num of ele
    for(i = 0; i < n; i++)
        scanf("%d", &a[i]);
    scanf("%d", &k);    // key
    t = k;
    for(i = 0; i <= k; i++)
    { 
        b[i] = a[t];
        t++;
        c++;            // count
        printf("%d ", b[i]);
    }
    for(i = c; i < n; i++)
    {
        while(j < k)   
        {
            b[i] = a[j];
            j++; 
        }
    }
    for(i = 0; i < n; i++)
        printf("%d", b[i]);
}

1 Ответ

0 голосов
/ 24 февраля 2019

Проблема заключается в смешении двух петель, которые либо правильные, либо почти правильные.Измените:

for(i = c; i < n; i++)
{
    while(j < k)   
    {
        b[i] = a[j];
        j++; 
    }
}

на

for(i = c; i < n; i++)
{
        b[i] = a[j];
        j++; 
}

Или

while(j < k)
{
    b[i] = a[j];
    j++;
    i++;
}

Ваш выбор.

Но, в конце концов, для этой ситуацииЯ бы пошел для использования memcpy для скорости, как в примере ниже:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    int n;
    scanf("%d", &n);
    int *a = malloc(n * sizeof(*a));
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    int k;
    scanf("%d", &k);
    int *b = malloc(n * sizeof(*b));
    memcpy(b, &a[k], (n - k) * sizeof(*a));
    memcpy(&b[n - k], a, k * sizeof(*a));
    for (int i = 0; i < n; i++)
        printf("%d ", b[i]);
    free(b);
    free(a);
    return EXIT_SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...