【问题标题】:Splitting array to alternate 4 elements in c在c中拆分数组以交替4个元素
【发布时间】:2020-09-23 17:39:33
【问题描述】:

让我们说 a=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

那我想要 x=[1,2,3,4,9,10,11,12] y=[5,6,7,8,13,14,15,16]

我可以这样做

#include <stdio.h>

int main()
{
int array[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int *firstHalf = malloc(8 * sizeof(int));
int *secondHalf = malloc(8 * sizeof(int));

memcpy(firstHalf, array, 4 * sizeof(int));
memcpy(secondHalf, array + 4,4 * sizeof(int));
memcpy(firstHalf+4, array+8, 4 * sizeof(int));
memcpy(secondHalf+4, array + 12,4 * sizeof(int));
for (int i=0;i<8;i++)
{
    printf("First %d\n",firstHalf[i]);
}  for (int i=0;i<8;i++)
{
    printf("Second %d\n",secondHalf[i]);
}
}

我这样做了,但需要一个解决方案将其放入 for 循环中以使其可扩展

请给我建议如何完成

【问题讨论】:

  • 我不明白为什么你只需要 4 个元素就开始复制 8 个元素。将 4 个元素复制到第一个数组,将接下来的 4 个元素复制到另一个数组,然后重复,注意结束条件,最后不完整的集合。

标签: arrays c split


【解决方案1】:

得到答案,但如果您有更好的建议,请告诉我

#include <stdio.h>

int main()
{
int array[32] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
int *firstHalf = malloc(16 * sizeof(int));
int *secondHalf = malloc(16 * sizeof(int));
//for (int h=0;h<9;h+=4)
for (int l=0,h=0;l<33,h<16;l=l+8,h=h+4)
{
    memcpy(firstHalf+h, array+l, 4 * sizeof(int));
memcpy(secondHalf+h, array + 4+l,4 * sizeof(int));
}
for (int i=0;i<16;i++)
{
    printf("First %d\n",firstHalf[i]);
}  for (int i=0;i<16;i++)
{
    printf("Second %d\n",secondHalf[i]);
}
}

【讨论】:

    【解决方案2】:

    我不太确定它是什么参数,你想要可扩展,所以我用两个参数重新创建了你的代码 N=2 是你最终想要的向量数量,M=4 是大小您要一起复制的块:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define N 2 // split in N=2 arrays
    #define M 4 // always copy M=4 items together
    
    int main()
    {
    int array[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    int *parts[N];
    for (int i=0;i<N;i++)
    {
        parts[i] = malloc(16 * sizeof(int) / N);
    }
    for (int i=0;i<16/N/M;i++)
    {
        for (int j=0;j<N;j++)
        {
            memcpy(parts[j]+i*M, array + i*M*N + j*M, M * sizeof(int));
        }
    }
    for (int i=0;i<8;i++)
    {
        printf("First %d\n",parts[0][i]);
    }  for (int i=0;i<8;i++)
    {
        printf("Second %d\n",parts[1][i]);
    }
    }
    

    您绝对应该根据上下文将 M、N 更改为有意义的名称并插入 M*N 等名称,如果您的数字不能像本例中那样整除,请特别注意。

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多