首页 > 解决方案 > C程序将数字数组向右移动N个位置购买无法正常工作

问题描述

这是我为实现以下目的而编写的 C 程序。

用户需要提供一个大小为 N 的整数数组 A 和一个整数 K ,程序需要将数组向右旋转 K 步,然后打印结果数组。

输入格式:

第一行由一个整数 T 组成,表示测试用例的数量。对于每个测试用例:第一行由两个整数 N 和 K 组成,N 是数组中元素的数量,K 表示旋转的步数。下一行由 N 个空格分隔的整数组成,表示数组 A 的元素。

输出格式:

在每个测试用例的单行中打印旋转后的数组。

这些是示例输入和输出 这是我为达到目的而编写的代码,


#include<stdio.h>

int  main()
{   int i,n,a[100],temp,shiftlimit,cyclelimit;
    int shiftcount = 0;
    int cyclcount = 0;
    scanf("%d",&cyclelimit);
    while(cyclcount != cyclelimit){

        scanf("%d",&n);
        scanf("%d",&shiftlimit);

        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }while(shiftcount != shiftlimit){
            temp=a[n-1];
            for(i=n-1;i>0;i--)
            {
                a[i]=a[i-1];
            }
            a[0]=temp;
            shiftcount += 1;}
        for(i=0;i<n;i++){
            printf("%d ",a[i]);
        }
        printf("\n");cyclcount +=1;}
}

并且有一些复杂性参数如下: 复杂性参数 当(第 7 行)为 1 时,此代码可以正常工作, T= cyclelimit但一旦用户输入 2 或更多,代码就会开始出现故障。我已经使用 while 循环来达到目的,但在 1 个循环后它不起作用。


我的输出:
我的输出
所需的输出: 预期的输出

标签: arrayscfor-loopwhile-loopuser-input

解决方案


1.,使用函数 - 不要在 main 中编程。2. 使用标准函数。

int *allocateArr(size_t N)
{

    int *arr = malloc(sizeof(*arr) * N);
    return arr;
}

int *rotateLeft(int *arr, size_t N, size_t K)
{
    int *temp = malloc(sizeof(*temp) * K);  /* check for errors*/

    for(size_t i = 0; i < K; i ++) temp[i] = arr[i];
    for(size_t i = 0; i < N - K; i ++) arr[i] = arr[K + i];
    for(size_t i = 0; i < K; i ++) arr[i + (N - K)] = temp[i];
    free(temp);
    return arr;
}

int *rotateRight(int *arr, size_t N, size_t K)
{
    return rotateLeft(arr, N, N - K);
}


#define SIZE 10

int main(void)
{
    int *arr = allocateArr(SIZE);  /* check for errors*/
    for(size_t i = 1; i <= SIZE; i++) arr[i - 1] = i;
    for(size_t i = 0; i < SIZE; i++) printf("%d ",arr[i]);
    printf("\n");
    rotateRight(arr, SIZE, 4);
    for(size_t i = 0; i < SIZE; i++) printf("%d ",arr[i]);
    printf("\n");
    for(size_t i = 1; i <= SIZE; i++) arr[i - 1] = i;
    rotateLeft(arr, SIZE, 4);
    for(size_t i = 0; i < SIZE; i++) printf("%d ",arr[i]);
    printf("\n");

    free(arr);
}
int *allocateArr(size_t N)
{

    int *arr = malloc(sizeof(*arr) * N);
    return arr;
}

int *rotateLeft(int *arr, size_t N, size_t K)
{
    int *temp = malloc(sizeof(*temp) * K);  /* check for errors*/

    memcpy(temp, arr, sizeof(*arr) * K);
    memmove(arr, arr + K, sizeof(*arr) * (N - K));
    memcpy(arr + (N - K), temp, sizeof(*arr) * K);
    free(temp);
    return arr;
}

int *rotateRight(int *arr, size_t N, size_t K)
{
    int *temp = malloc(sizeof(*temp) * K);  /* check for errors*/

    memcpy(temp, arr + (N - K), sizeof(*arr) * K);
    memmove(arr + K, arr, sizeof(*arr) * (N - K));
    memcpy(arr, temp, sizeof(*arr) * K);
    free(temp);
    return arr;
}


#define SIZE 10

int main(void)
{
    int *arr = allocateArr(SIZE);  /* check for errors*/
    for(size_t i = 1; i <= SIZE; i++) arr[i - 1] = i;
    for(size_t i = 0; i < SIZE; i++) printf("%d ",arr[i]);
    printf("\n");
    rotateRight(arr, SIZE, 4);
    for(size_t i = 0; i < SIZE; i++) printf("%d ",arr[i]);
    printf("\n");
    for(size_t i = 1; i <= SIZE; i++) arr[i - 1] = i;
    rotateLeft(arr, SIZE, 4);
    for(size_t i = 0; i < SIZE; i++) printf("%d ",arr[i]);
    printf("\n");

    free(arr);
}

结果:

1 2 3 4 5 6 7 8 9 10 
7 8 9 10 1 2 3 4 5 6 
5 6 7 8 9 10 1 2 3 4 

推荐阅读