簡體   English   中英

在 C 中移動數字序列?

[英]shifting a sequence of numbers in C?

我有一個問題,關於一些試圖環繞我試圖在 C 編程語言中轉換的數字序列的問題。 在我通過循環計算的數字序列中找到的第一個值最終被拋出。 下面是代碼現在的樣子:

numbers[d] = numbers[x];
for (d = y-1; d >=0; d --){
 numbers[d] = numbers[(d -  1) % y];
 printf(" numbers[d] = %d \n", numbers[d]);
}

這是我從上一個循環計算的數字[x]:

1, 17, 3, 15, 14, 6, 12, 8, 10

這是數字[d]目前的樣子:

17, 3, 15, 14, 6, 12, 8, 10, 10

...這是它應該是什么樣子:

17, 3, 15, 14, 6, 12, 8, 10, 1

似乎它沒有將 1 包裹到最后。 我的循環中是否缺少條件? 謝謝!

代碼

#include <stdio.h>

static const int debug = 0;

static void dump_array(const char *tag, int n, const int array[n])
{
    printf("%s (%d)", tag, n);
    for (int i = 0; i < n; i++)
        printf("%3d", array[i]);
    putchar('\n');
}

static void rot1u(int n, int numbers[n])
{
    int v = numbers[n-1];
    for (int d = n - 1; d >= 0; d--)
    {
        numbers[d] = numbers[(n + d - 1) % n];
        if (debug)
            printf(" numbers[%d] = %d\n", d, numbers[d]);
    }
    numbers[0] = v;

    dump_array("Up After: ", n, numbers);
}

static void rot1d(int n, int numbers[n])
{
    int v = numbers[0];
    for (int d = 0; d < n; d++)
    {
        numbers[d] = numbers[(d + 1) % n];
        if (debug)
            printf(" numbers[%d] = %d\n", d, numbers[d]);
    }
    numbers[n-1] = v;

    dump_array("Dn After: ", n, numbers);
}

int main(void)
{
    int numbers[] = { 1, 17, 3, 15, 14, 6, 12, 8, 10 };
    enum { N_NUMBERS = sizeof(numbers) / sizeof(numbers[0]) };
    dump_array("-- Before:", N_NUMBERS, numbers);

    rot1u(N_NUMBERS, numbers);
    rot1d(N_NUMBERS, numbers);
    rot1d(N_NUMBERS, numbers);
    rot1d(N_NUMBERS, numbers);
    rot1u(N_NUMBERS, numbers);
    rot1u(N_NUMBERS, numbers);

    return 0;
}

示例輸出

-- Before: (9)  1 17  3 15 14  6 12  8 10
Up After:  (9) 10  1 17  3 15 14  6 12  8
Dn After:  (9)  1 17  3 15 14  6 12  8 10
Dn After:  (9) 17  3 15 14  6 12  8 10  1
Dn After:  (9)  3 15 14  6 12  8 10  1 17
Up After:  (9) 17  3 15 14  6 12  8 10  1
Up After:  (9)  1 17  3 15 14  6 12  8 10

讓我們分析您的for循環,減去printf語句。

for (d = y-1; d >=0; d --){
 numbers[d] = numbers[(d -  1) % y];
}

在開始循環之前,您在numbers有以下值。

1, 17, 3, 15, 14, 6, 12, 8, 10

y值為9

在循環的第一次迭代中, d = 8 (d-1)%y = 7 您將number[8]的值替換為number[7] 數組變為:

1, 17, 3, 15, 14, 6, 12, 8, 8

在循環的下一次迭代中, d = 7 (d-1)%y = 6 您將number[7]的值替換為number[6] 數組變為:

1, 17, 3, 15, 14, 6, 12, 12, 8

當您到達d=1的迭代時, (d-1)%y = 0 您將number[1]的值替換為number[0] 數組變為:

1, 1, 17, 3, 15, 14, 6, 12, 8

在下一次迭代中, d=0(d-1)%y = -1 該聲明

 numbers[d] = numbers[(d -  1) % y];

相當於

 numbers[0] = numbers[-1];

這肯定會導致未定義的行為,但它並不能解釋輸出中的其他數字。 也許您發布的輸出對應於不同的代碼塊。

我認為@JonathanLeffler 的答案為您的算法問題提供了解決方案。 我不會在這里重復。

您需要保存在循環之前應該旋轉到另一側的元素,然后才將其放入適當的位置(將它們放入適當的位置)。

#include <stdio.h>
#include <time.h>
#define METHOD 2
#define MAX_SKIERS 20
int starting_lineup[MAX_SKIERS+1];
int main(void)
{
int i, num_skiers = 20;
srand(time(NULL));
int pos1, pos2, temp;
for (i = 0; i <= num_skiers; i++)
starting_lineup[i] = i;
for (i = 0; i < num_skiers*2; i++) {
// Generate two random positions
pos1 = rand() % num_skiers + 1;
pos2 = rand() % num_skiers + 1;
// Swap the skiers at the two positions
temp = starting_lineup[pos1];
starting_lineup[pos1] = starting_lineup[pos2];
starting_lineup[pos2] = temp;
}
printf("The starting lineup (first to last):\n");
for (i = 1; i <= num_skiers; i++)
printf("%s%d", (i == 1 ? "" : ", "), starting_lineup[i]);
putchar('\n');
return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM