C 语言:
有n个整数,使其前面各数顺序后移m个位置,最后m个数变成最前面m的数
(自己写的程序和别人写的程序的对比,只有对比才能发现一些算法的巧妙,希望和大家共同进步。)
//自己写的
#include <stdio.h>
#define N 10 //个数
#define M 3 //向后移动的次数
int main()
{
void output(const int* a);
void move(int* a, int num);
int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
output(a);
move(a, M);
output(a);
int c;
scanf("%d", &c);
return 0;
}
void output(const int* a)
{
int i = 0;
while (i < N)
{
printf("%-4d", *(a+i));
i++;
}
printf("\n");
}
void move(int* a, int num)
{
int i, j, temp;
int b[M] = {0};
i = j = 0;
while (i < M)
{
b[i] = *(a+N-M+i); //后面几位先保存
// printf("b[%d] = %-4d", i, b[i]);
i++;
}
i = 0;
while (i < M)
{
j = N - M + i;
for (j; j >= 0; j--)
{
*(a+j+1) = *(a+j); //从后面开始数依次后移
}
i++;
}
i = 0;
while (i < M)
{
*(a+i) = *(b+i);//M个数放入新数组
i++;
}
}
//别人写的
#include <stdio.h>
//每次调用函数实际只移动一位
void move(int array[20], int n, int m)
{
int *p, array_end;
array_end = *(array+n-1);
for (p = array + n - 1; p > array; p--)
{
*p = *(p-1);
}
*array = array_end;
m--;
if (m > 0)
{
move(array, n, m); //递归函数调用
}
}
int main()
{
int number[20], n, m, i;
printf("The total numbers is: ");
scanf("%d", &n);
printf("back m: ");
scanf("%d", &m);
for (i = 0; i < n; i++)
{
scanf("%d", &number[i]);
}
move(number, n, m);
for (i = 0; i < n - 1; i++)
{
printf("%d, ", number[i]);
}
printf("%d", number[n-1]);
int c;
scanf("%d", &c);
return 0;
}