给定的代码用于给定键的旋转数组

时间:2019-02-24 11:47:54

标签: c

在下面给出的代码中,(例如n = 5)数组'b'的最后两个索引(即b [4],b [5])显示了垃圾值。为什么会这样?
样本i / 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 :(得分:0)

问题在于混合了两个循环,这些循环要么是对的,要么是对的。更改:

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;
}