输入n个整数 然后输入一个整数m 做一个函数 把这n个整数的最后m个变为最开始m个 最开始n-m个往后移m个 互相调换位置
补充一句废话心得 我现在知道什么是算法了 比如一个题 你怎么去解这个题 不需要一步一步的详细步骤 大致的思路其实就是这个题的算法 那么 这个题怎么弄呢?
这里给出了很多种方法 各个不同 又都有相似之处
第一种方法const int n = 10;
int main()
{
void adjust(int a[]);
int a[n];
for (int i = 0; i < n; i++) //输入10个整数 以数组形式储存
cin >> a[i];
adjust(a);
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
return 0;
}
void adjust(int a[])
{
void adj(int a[]);
cout << "请输入将最后几个数字调整呢?" << endl;
int m = 0; //最后m个数字调整
cin >> m;
for (int i = 0; i < m; i++) //进行m次 每一次都是把最后一个调至第一个
{
adj(a);
}
}
void adj(int a[])
{
int tmp = a[n - 1];
for (int i = n - 1; i > 0; i--)
{
a[i] = a[i - 1];
}
a[0] = tmp;
}
上方这个是我第一时间想出来的 很简单易懂 其实m个调为最前面m个 可以拆分为m次把最后一个调至最前面
再说一句 其实这个章节的题是要以指针或引用的形式来写的 下面给出上方第一种解的指针形式 其实本质都一样的
一解指针版const int n = 10;
int main()
{
void adjust(int *a);
int a[n];
for (int i = 0; i < n; i++) //输入10个整数 以数组形式储存
cin >> a[i];
int* p = a;
adjust(p);
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
return 0;
}
void adjust(int *a)
{
void adj(int *a);
cout << "请输入将最后几个数字调整呢?" << endl;
int m = 0; //最后m个数字调整
cin >> m;
for (int i = 0; i < m; i++) //进行m次 每一次都是把最后一个调至第一个
{
adj(a);
}
}
void adj(int *a) //首元素地址
{
int tmp = *(a + n - 1); //最后元素
int* p = a; //这里是首元素地址
for (p += n - 1; p > a; p--)
*p = *(p - 1);
*a = tmp;
}
讲道理没什么太大不同的 就是最后那部分有点差别 权当凑字数了吧
第二种方法int main()
{
void Move(int arr[], int n);
void Show(int arr[], int n);
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
Move(arr, sizeof(arr) / sizeof(arr[0]));
Show(arr, sizeof(arr) / sizeof(arr[0]));
return 0;
}
void Move(int arr[], int n) //n是元素的个数
{
//思路 先把最后m个元素 储存在一个临时数组中 然后把前面m-n个进行后移 最后把m个放到最前面m个中
int brr[3];
for (int i = 0; i < 3; i++) //先把最后3个复制到brr中
{
brr[i] = arr[n - 3 + i]; //为什么是n-3呢 n-1是倒数第一个 n-3是倒数第三个 这样想会快一点
}
// 然后把前面n-m个往后移
for (int i = n-1; i > 2; i--) //这个2其实也和调整的个数有关
{
arr[i] = arr[i - 3]; //i-3怎么理解 往前数3个 就是要调整的 i-m
}
// brr中的3个放到arr的前三个
for (int i = 0; i < 3; i++)
{
arr[i] = brr[i];
}
}
void Show(int arr[], int n) //n是数组的元素个数
{
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
}
说实话这种方法就很差了显得 因为没法改变brr数组的元素个数 也就是没法输入要调整的个数 这里就默认为3 举个例子了 其实主要是思路 就是把要调整的放到另一个数组中进行操作
其实也不是不能吧 可能后面学了动态内存之后就可以了 但是我不知道那么动态内存可以用变量来开辟空间吗
一个比较好看的版本
int main()
{
void move(int* p, int n, int m);
int number[20], n, m;
cout << "How many numbers?";
cin >> n;
cout << "Input " << n << "numbers:";
for (int i = 0; i < n; i++)
cin >> number[i];
cout << "how many places do you want move?";
cin >> m;
move(number, n, m);
cout << "Now, they are:" << endl;
for (int i = 0; i < n; i++)
cout << number[i] << " ";
return 0;
}
// 一共n个元素 进行m次反转 即12345 第一次:51234 第二次: 45123
void move(int* p, int n, int m)
{
//int* end = p + n - 1; //p是首元素地址
int end = *(p + n - 1);
for (int i = n; i > 1; i--)
{
p[i - 1] = p[i - 2]; //p[1]=p[0]
}
p[0] = end;
m--;
if (m > 0)
move(p, n, m);
}
其实这个和第一种几乎差不多 思路是一样的 只是这用到了递归 好像



