目录
1.习题8-3 数组循环右移 (20 分)
题目: 本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由()变换为(
⋯
⋯
)(最后m个数循环移至最前面的m个位置)。
输入:第一行给出两个整数n和m,n是数组的大小;m是右移的位数。第二行给出n个整数。
输出:在一行内输出右移后的数组。
优化目标:无。
算法思想:1.将数组分为两个区间[0,n-m-1]、[n-m,n-1]。
2.分别对两个区间的数组元素逆置。
3.对[0,n-1]区间的元素逆置。
ps:这个算法的思想可以从一维数组推广到求矩阵的转置。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
实现:
#include <stdio.h>
#define MAXN 10
void ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
void reverse(int a[], int l , int r){
int t = 0;
while(l < r){
t = a[l];
a[l] = a[r];
a[r] = t;
l++;
r--;
}
return ;
}
void ArrayShift( int a[], int n, int m )
{
m %= n;
reverse(a,0,n-m-1);
reverse(a,n-m,n-1);
reverse(a,0,n-1);
return ;
}
2.习题8-4 报数 (20 分)
题目:报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。
本题要求编写函数,给出每个人的退出顺序编号
输入:第一行给出两个整数n,m。n是初始人数;m是游戏规定的退出位次。
输出:在一行内输出给出每个人的退出顺序编号。
优化目标:无。
算法思想:用一个循环来简单地模拟报数的过程。
输入样