解题思路:
一种思路是向后移动,把最后一个数字备份,移动完
num_number - 1次后把最后一个数赋值给第一个
总共移动move_number次
注意
if(move_number > num_number)
{
move_number = move_number % num_number;
}
move_number有周期性
第二种思路是交换
比如 1 2 3 move_number = 2
第一次移动 3 2 1 3 1 2
第二次移动 2 1 3 2 3 1
每次移动都是第一个数到第move_number个数分别和最后一个数交换
注意事项:
参考代码:
#include <stdio.h>
#include <string.h>
void integer_move();
int main()
{
integer_move();
return 0;
}
void integer_move()
{
int num_number = 0, move_number = 0;
while(num_number <= 0)
{
scanf("%d", &num_number);
}
int arr[num_number];
int temp = 0,temp1 = 0;
memset(arr, 0, sizeof(arr)); // 使用memset进行初始化
// 这个错误发生在C语言中,因为可变长度数组(Variable-Length Arrays, VLAs)
// 不能使用 {0} 进行初始化。在标准C中,可变长度数组在声明时不能被初始化
// 使用 memset() 函数在声明后对数组进行初始化
// 或者使用循环将所有元素设置为零
// 考虑添加输入验证以提高程序健壮性
for (int i = 0; i < num_number; i++)
{
scanf("%d", &arr[i]);
}
scanf("%d", &move_number);
if(move_number > num_number)
{
move_number = move_number % num_number;
}
for(int j = 0; j < move_number; j++)
{
int last = arr[num_number - 1]; // 保存最后一个元素
for(int i = num_number - 1; i > 0; i--)
{
printf("before move:");
// for(int j = 0; j < num_number; j++)
// {
// printf("%d ", arr[j]);
// }
// *(arr + i) = *(arr + i - 1);
printf("after move:");
// for(int j = 0; j < num_number; j++)
// {
// printf("%d ", arr[j]);
// }
// printf("\n");
}
*arr = last;
}
for(int i = 0; i < num_number; i++)
{
printf("%d ", arr[i]);
}
}
// //方法2
// #include <stdio.h>
// #include <string.h>
// void integer_move();
// int main()
// {
// integer_move();
// return 0;
// }
// void integer_move()
// {
// int num_number = 0, move_number = 0;
// while(num_number <= 0)
// {
// scanf("%d", &num_number);
// }
// int arr[num_number];
// int temp = 0,temp1 = 0;
// memset(arr, 0, sizeof(arr)); // 使用memset进行初始化
// // 这个错误发生在C语言中,因为可变长度数组(Variable-Length Arrays, VLAs)
// // 不能使用 {0} 进行初始化。在标准C中,可变长度数组在声明时不能被初始化
// // 使用 memset() 函数在声明后对数组进行初始化
// // 或者使用循环将所有元素设置为零
// // 考虑添加输入验证以提高程序健壮性
// for (int i = 0; i < num_number; i++)
// {
// scanf("%d", &arr[i]);
// }
// scanf("%d", &move_number);
// if(move_number > num_number)
// {
// move_number = move_number % num_number;
// }
// for(int j = 0; j < move_number; j++)
// {
// for(int i = 0; i < num_number - 1; i++)
// {
// // printf("before move:");
// // for(int j = 0; j < num_number; j++)
// // {
// // printf("%d ", arr[j]);
// // }
// temp = *(arr + i);
// *(arr + i) = *(arr + num_number - 1);
// *(arr + num_number - 1) = temp;
// // printf("after move:");
// // for(int j = 0; j < num_number; j++)
// // {
// // printf("%d ", arr[j]);
// // }
// // printf("\n");
// }
// }
// for(int i = 0; i < num_number; i++)
// {
// printf("%d ", arr[i]);
// }
// }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复