栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c 指针 有n个整数, 使前面各数顺序向后移m个位置, 最后m个数变成最前面m个数, 写一函数实现以上功能 在主函数中输入n个整数, 并输出调整后的n个数。

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c 指针 有n个整数, 使前面各数顺序向后移m个位置, 最后m个数变成最前面m个数, 写一函数实现以上功能 在主函数中输入n个整数, 并输出调整后的n个数。

题目翻译:

输入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);
}

其实这个和第一种几乎差不多   思路是一样的 只是这用到了递归  好像

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/690972.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号