arrays - 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 个循环后它不起作用。
解决方案
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
推荐阅读
- lucee - 从控制器方法渲染 JSON
- c# - EF Core 5.0 中的多对多关系是否可以配置为仅保留一个导航属性(在一侧)?
- reactjs - 如何将 React 片段转换为数组?
- javascript - vim中的javascript AMD标签?
- pine-script - 我们可以使用 TradingView 访问 pine 脚本中的交易面板选项卡吗?
- java - 仅使用 1、2、3 步即可达到第 n 步
- java - Windows 上的字符编码混淆
- ios - 交换 UITextField 的 isEnabled 更改背景颜色以及如何防止它
- python - Pandas 对 bp 进行分组,根据条件过滤和提取行
- java - 我怎样才能拥有这两个构造函数?