[英]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.