设有n个整数,现在要使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。

方法一:先将最后m个数保存在新的b数组中,然后将n-m个数拉至原数组a尾部,再将b数组依次赋值给a数组的前m个数。

#include<stdio.h>
#define N 80
int main(){
	int a[N],b[N],i;
	int n,m;
    printf("input the n and m:\n");
    scanf("%d %d",&n,&m);
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}	
    for(i=0;i<m;i++){
    	b[i]=a[n-m+i];//将最后m个数保存在数组b中
	}
	for(i=n-1;i>=m;i--){
		a[i]=a[i-m];//将n-m个数拉至数组a的尾部
	}
	for(i=0;i<m;i++){
		a[i]=b[i];//将保存在数组b中的最后m个数赋值回数组a的前m个位置
	}
	printf("After move,the array now:\n");
	for(i=0;i<n;i++){
		printf("%-3d",a[i]);
	}
	return 0;
}

 

 

 

 

方法二:将数组元素整体后移m个位置,然后将尾部的m个元素移动到数组前m个位置。

#include<stdio.h>
main()
{
	char a[100];
	int i=0,c=0,j=0,m;
	printf("输入m:");
	scanf("%d",&m);
	printf("输入整数:");
	for (i=0;;i++)
	{
		scanf("%d",&a[i]);
		c++;
		if (getchar()=='\n')
			break;
	}
	for (i=c-1;i>=0;i--)
		a[i+m]=a[i];//所有元素后移m位
	for (i=c;i<c+m;i++)
		a[j++]=a[i];//将数组尾部的m个元素移动至数组前m个位置 
	for (i=0;i<c+m;i++)
		printf("%3d",a[i]);
	putchar('\n');
}

方法三:使用递归函数进行移位


#include<iostream>
 
using namespace std;
 
int main()
{
	void move(int *array,int n,int m);  //函数声明
 
	int number[20];   //定义数组长度为20的数组
 
	int i,n,m;      
 
	cout<<"请输入要输入多少个数:"<<endl;
 
	cin>>n;
 
	cout<<endl<<"请输入"<<n<<"个整数:"<<endl;
 
	for(i=0;i<n;i++)
	{
		cin>>number[i];
	}
 
	cout<<endl<<"请输入要后移多少位置:"<<endl;
 
	cin>>m;
 
	move(number,n,m);   //函数调用
 
	cout<<endl<<"后移后的排序为:"<<endl;
 
	for(i=0;i<n;i++)  //输出元素
	{
		cout<<number[i]<<"  ";   
	}
 
	cout<<endl;
 
	return 0;
}
 
 
 
 
//这是使循环后移一次,通过m调节后移几次
 
void move(int *array,int n,int m) //使循环后移一次的函数 
{
	int *p,array_end;        //定义一个指针变量p,和一个变量array_end
 
	array_end=*(array+n-1);  //将array中的最后一个元素的值赋给array_end  
 
	for(p=array+n-1;p>array;p--)  //从数组最后一个元素开始向前  把前一个元素的值赋给后一个元素  
	{
		*p=*(p-1);       
	}
 
	*array=array_end;    //将array_end的值赋给第一个元素的值  因为之前将最后一个元素的值赋给了array_end
 
	m--;    // 通过m控制此函数执行几次  从而后移几个数
 
	if(m>0)
	{
		move(array,n,m);  //递归调用,当循环次数m减至为0时,停止调用
	}
 
 

--------------------- 
作者:宾宾琪琪 
来源:CSDN 
原文:https://blog.csdn.net/liubinzi123/article/details/8261555 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 10
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值