题目
本题是谭浩强《C程序设计课后习题》题8.4。
题目:
有n个整数, 使前面各数顺序向后移m个位置, 最后m个数变成最前面m个数, 写一函数实现以上功能, 在主函数中输人n个整数和输出调整后的n个数。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj
一、解题思路
思路:
本题可采用两种方法实现字符移动功能,第一种是双重for循环,第二种是递归调用,具体实现方法大家看一下代码,我把两种代码都公布出来。
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.第一种,递归调用实现的函数代码
代码如下(示例):
void move(int arry[], int n, int m)
{
int* p, arry_end;
arry_end = *(arry + n - 1);
for (p = arry + n - 1; p > arry; p--)
*p = *(p - 1);
*arry = arry_end;
m--;
if (m > 0)move(arry, n, m);
}
3.第二种,双重for循环实现的函数代码
代码如下(示例):
void move(int arry[], int n, int m)
{
for (int i = 0; i < m; i++)
{
int tmp = *(arry + n - (m - i));
for (int j = n - (m - i); j > i; j--)
{
*(arry + j) = *(arry + j - 1);
}
*(arry + i) = tmp;
}
}
4.主函数部分
代码如下(示例):
int main()
{
int arry[20];
int* p_arry = arry;
int n, m;
printf("请输入n的大小,用于确定数字的大小:");
scanf("%d", &n);
printf("请输入m的大小,用于确定要移动末尾有多少数字:");
scanf("%d", &m);
printf("请输入%d个数,用于赋值到数组中:\n",n);
for (int i = 0; i < n; i++)
scanf("%d", p_arry + i);
move(arry, n, m);
printf("排完序的数组为:\n");
for (int i = 0; i < n; i++)
printf("%d ", *(p_arry + i));
return 0;
}
三、执行结果
输出:
请输入n的大小,用于确定数字的大小:10
请输入m的大小,用于确定要移动末尾有多少数字:4
请输入10个数,用于赋值到数组中:
1 2 3 4 5 6 7 8 9 10
排完序的数组为:
7 8 9 10 1 2 3 4 5 6