【问题标题】:shifting a sequence of numbers in C?在C中移动一个数字序列?
【发布时间】:2014-04-19 01:49:34
【问题描述】:

我有一个问题,关于一些试图环绕我试图在 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 包裹到最后。我的循环中是否缺少条件?谢谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。循环开始前d 的值是多少? x 的值是多少?请注意,当被除数为负且除数为正时,%(模数)运算符返回负值。当您到达d == 0 时,您正在从(d - 1) % y 复制,即-1

标签: c loops circular-permutations


【解决方案1】:

让我们分析您的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 的回答可以解决您的算法问题。此处不再赘述。

【讨论】:

    【解决方案2】:

    代码

    #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
    

    【讨论】:

      【解决方案3】:

      您需要在循环之前保存应该旋转到另一侧的元素,然后再将其放入适当的位置(将它们放入适当的位置)。

      【讨论】:

        【解决方案4】:
        #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;
        }
        

        【讨论】:

          猜你喜欢
          • 2021-06-15
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 2020-01-30
          • 1970-01-01
          • 2010-10-06
          • 1970-01-01
          • 2013-07-06
          相关资源
          最近更新 更多