有n個整數,使前面各數順序向后移m個位置,最后m個數變成最前面m個數,見圖8.43。 寫一函數實現以上功能,在主函數中輸人n個整數和輸出調整后的n個數。
解題思路: 找出倒數第m個數據,從這里開始保存倒數第m位置的數據,因為倒數第m位置的數據要放到數組最前方,將m之前的數據向后偏移一位,然后將數組第一個位置的數據替換為保存的m位的數據,逐個往后遞增即可。
答案:
#include <stdio.h>
void move(int *arry, int n, int m)
{
int end_idx = n - m;//找到倒數第m個數據的位置,也就是要移動到數組首部的數據的起始位置
for (int i = 0; i < m; i++) {
int *p = arry + end_idx + i;//從倒數第m個數據的位置開始逐漸向后偏移直到數組尾部
int tmp = *p;//獲取到這個位置的值,用於數組前邊數據向后偏移1位之后,向數組第i位賦值
for (int j = end_idx + i; j > i; j--) {//從第i位開始逐個向后偏移一位
*p = *(p - 1);
p--;
}
*(arry + i) = tmp;//數組的前第i個數字逐個替換為后邊被覆蓋的值
}
}
int main()
{
int number[32], n, m, i;
printf("Please enter the number of numbers: ");
scanf_s("%d", &n);//先確定要輸入多少個數字
printf("Please enter %d numbers: ", n);
for (i = 0; i < n; i++) {
scanf_s("%d", &number[i]);//輸入指定個數的數字
}
printf("Number of positions to move: ");
scanf_s("%d", &m);//確定要向后移動多少個位置
move(number, n, m);
for (i = 0; i < n; i++) {
printf("%d ", number[i]);
}
printf("\n");
system("pause");
return 0;
}