是向左方向旋转阵列的efficeint程序吗?

时间:2017-07-05 08:12:49

标签: c arrays rotation

#include<stdio.h>
#include<stdlib.h>

main()
{
    int i,j,l,m,n;
    j=0;
    printf("\nenter 5 element single dimension array\n");
    printf("enter shift rate\n");
    scanf("%d",&n);

    /* Here we take input from user that by what times user wants to rotate the array in left. */

    int arr[5],arrb[n];
    for(i=0;i<=4;i++){
        scanf("%d",&arr[i]);
    }

    /* Here we have taken another array. */

    for(i=0;i<=4;i++){
        printf("%d",arr[i]);
    }
    for(i=0;i<n;i++){
        arrb[j]=arr[i];
        j++;
        // These loop will shift array element to left by position which's entered by user.
    }
    printf("\n");

    for(i=0;i<=3;i++){
        arr[i]=arr[i+n];
    }
    for(i=0;i<=4;i++){
        if(n==1 && i==4)
            break;
        if(n==2 && i==3)
            break;
        if(n==3 && i==2)
            break;
        printf("%d",arr[i]);
    }

    //To combine these two arrays. Make it look like  single array instead of two
    for(i=0;i<n;i++){
        printf("%d",arrb[i]);
    }
    // Final sorted array will get printed here
}

2 个答案:

答案 0 :(得分:3)

  

是向左方向旋转数组的效果程序吗?

实际上,非常复杂,并且包含一些问题:

for(i = 0; i < n; i++)
{
    arrb[j] = arr[i];
    j++;
}

为什么不简单:

for(i = 0; i < n; i++)
{
     arrb[i] = arr[i];
}

不需要第二个变量。但是,如果n大于5,则会遇到麻烦,因为您将从其附加访问arr(未定义的行为!)。至少,你应该检查用户输入!

for(i = 0; i <=3 ; i++)
{
    arr[i] = arr[i + n];
}

同样的问题:最后一个可访问的索引是4(四),所以n不能超过1,否则你再次访问数组超出范围......

第一个阵列的打印循环中的那些很多无法高效...

你可以拥有更多,更简单的东西:

int arr[5], arrb[5];
//               ^

for(int i = 0; i < 5; ++i)
    arrb[i] = arr[(i + n) % 5];

但这并未涵盖n的否定值。

    arrb[i] = arr[(((i + n) % 5) + 5) % 5];

即使对于负值也是安全的...现在你需要输出的所有内容是:

for(int i = 0; i < 5; ++i)
    printf("%d ", arrb[i]);

但最后会发现一个问题:如果用户为n输入的值大于INT_MAX - 4,则会出现有符号整数溢出,这也是未定义的行为!

我们可以通过更改索引公式来再次讨论这个问题:

arrb[i] = arr[(5 + i + (n % 5)) % 5];

n % 5是不变的,所以我们可以将它移出循环:

n %= 5;
for(int i = 0; i < 5; ++i)
    arrb[i] = arr[(5 + i + n) % 5];

最后,如果我们已经将n置于正外,我们可以在for循环中省略添加。

n = ((n % 5) + 5) % 5;
for(int i = 0; i < 5; ++i)
    arrb[i] = arr[(i + n) % 5]; // my original formula again...

对于长时间运行的循环,最后一步尤其值得考虑。

答案 1 :(得分:0)

我想你想做这样的事情(你应该检查0&lt; = n&lt; = 5):

int b[5];
int k = 0;
for(i=0; i<5; i++){

    if (i < 5 - n)
        b[i] = arr[i+n];
    else
    {
        b[i] = arr[k];
        k++;
    }
}

数组b用于保存旋转的矩阵。