我正在尝试创建一个带有数组的程序并将其向后还原,但程序必须以三个为一组对数组执行此操作。因此,如果用户在数组中输入数字1,2,3,4,5,6,程序将输出:3,2,1,6,5,4。
当我运行当前程序时,我得到:3 2 1 4 5 6.如果有人能帮我弄清楚为什么那会很好,因为我有点困惑。
这是我的代码:
int * numbersProcessFour(int *x, int size)
{
int i = 0, three = 3, six = 6, nine = 9;
if (size < 4)
{
for (i; i < three; i++)
{
reverse_array(x, three);
printf("%d ", x[i]);
}
}else if (size > 3 && size < 7)
{
for (i; i < three; i++)
{
reverse_array(x, three);
printf("%d ", x[i]);
}
for (i; i < 6; i++)
{
reverse_array(x, three);
printf("%d ", x[i]);
}
}
else if (size > 6 && size < 10)
{
for (i; i < three; i++)
{
reverse_array(x, three);
printf("%d ", x[i]);
}
for (i; i < 6; i++)
{
reverse_array(x, three);
printf("%d ", x[i]);
}
for (i; i < 9; i++)
{
reverse_array(x, three);
printf("%d ", x[i]);
}
}
}
void reverse_array(int *x, int length)
{
int i, temp;
for (i = 0; i<length / 2; i++)
{
temp = x[i];
x[i] = x[length - i - 1];
x[length - i - 1] = temp;
}
}
答案 0 :(得分:1)
每个3的倍数都有分支,效率很低。解决这个问题的一种方法是你可以将数组拆分为3个较小的数组,然后反转它们。另外,反转3个元素的数组与交换第1个和第3个元素相同。
int i;
int temp;
for (i = 0; i < count; i += 3) {
if (i+2 >= count)
break;
temp = arr[i];
arr[i] = arr[i+2];
arr[i+2] = temp;
}
答案 1 :(得分:1)
numberProcessFour
的通用版本可能如下所示。
int reverse_array_mod(int *input, size_t size, int mod)
{
int i, smod;
/* Error: return modulus if size cannot be divided by mod */
if(size%mod)
return size%mod;
smod = size/mod;
for(i=0; i<smod; i++)
reverse_array(input+i*mod, mod);
/* return 0 on success */
return 0;
}
int main(int argc, char **argv)
{
int a[] = {0, 1, 2, 3, 4, 5};
int i, err, mod;
for(mod=1; mod<5; mod++) {
err = reverse_array_mod(a, 6, mod);
if(err) {
fprintf(stderr, "Error %d, modulus %d invalid\n", err, mod);
return err;
}
for(i=0; i<6; i++)
printf("%d\n", a[i]);
printf("\n");
}
return 0;
}
结果:
0
1
2
3
4
5
1
0
3
2
5
4
3
0
1
4
5
2
Error 2, modulus 4 invalid
答案 2 :(得分:1)
继续从你的评论到fluter的答案,你可能会过度思考它。为了交换数组的每个3元素分区中的第1个和第3个元素,您只需要一次遍历数组3个元素。您需要决定如何处理任何最终的部分分区,但由于您的目标是交换第1和第3个分区,因此在完全分区中没有第3个,因此逻辑选择是忽略任何最终的部分分区。
您和Fluter使用swap
合并的变体将是:
/* reverse 1st and 3rd element in each group of 3 */
void rev3 (int *a, size_t sz)
{
if (sz < 3) return;
size_t i;
for (i = 0; i < sz; i += 3) {
if (sz - i < 3) break;
swap (&a[i], &a[i+2]);
}
}
你可以把它放在一起:
#include <stdio.h>
void rev3 (int *a, size_t sz);
void swap (int *a, int *b);
int main (void) {
int a[] = {1,2,3,4,5,6,7,8,9};
size_t i;
rev3 (a, sizeof a/sizeof *a);
for (i = 0; i < sizeof a/sizeof *a; i++) printf (" %2d", a[i]);
putchar ('\n');
return 0;
}
void swap (int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
使用示例
编译并运行时,它将为您提供在问题中指定的整个数组中第1个和第3个元素的交换(反转)。
$ ./bin/revarr3
3 2 1 6 5 4 9 8 7
使用单独的swap
或是否在撤消功能中包含该操作没有区别。当程序方法起作用时,也不需要额外听到调用递归函数。查看所有答案,比较/对比实现目标的不同方法。
答案 3 :(得分:0)
试试这个
if( x < min ) {
previousMin = min;
min = x; <----- I was after if i could have a 2nd statement