c语言实现数组循环左移m位

目录
  • c语言数组循环左移m位
  • 数组循环左移的简单方法
    • 输入格式
    • 输出格式

c语言数组循环左移m位

#include<stdio.h>
//函数原型
void rightshiftleft(int *p_num,int n,int m);
void enterint(int *p_num,int n);
//主函数
void main(){
	int num[100] = {1,2,3,4,5},*p_num = num;
	int n = 5,m = 2;
	printf("Int =:");
	scanf("%d",&n);
	printf("M =:");
	scanf("%d",&m);
	//整数输入
	enterint(p_num,n);
	//数组左移
	rightshiftleft(p_num,n,m);
	for(int i = 0; i < n; i++){
	printf("%-5d",p_num[i]);
	}

}

//整数输入
void enterint(int *p_num,int n){
	for(;n > 0 ; n--){
	scanf("%d",p_num++);
	}
}

//循环数组左移算法
void rightshiftleft(int *p_num,int n,int m){
	//临时变量
	int temp = 0;
	//外层循环控制需要左移的次数
	for(int k = 0;k < m ; k++){

		temp = p_num[n - m + k];
		//内层循环控制n-m的数组元素整体右移一位
		for(int i = 0; i < n - m ; i++){
			p_num[n -m -i+ k] = p_num[n - m -1 -i +k];
		}
		p_num[k] = temp;
	}
}

数组循环左移的简单方法

本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1…an-1)变换为(am…an-1a0a1…am-1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式

输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。

输出格式

在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例

8 3
1 2 3 4 5 6 7 8

输出样例

4 5 6 7 8 1 2 3

代码如下:

#include<stdio.h>
int main()
{
    int n,m,i;
    scanf("%d%d",&n,&m);//获取n和m的值
    if(m>n)
        m=m%n;//去掉多余无意义的左移次数
    int a[n];
    for(i=n-m;i<n;i++)//先从左移后的位置开始存
        scanf("%d",&a[i]);
    for(i=0;i<n-m;i++)//再从a[0]往后存
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)//输出数组中的各个元素
    {
        printf("%d",a[i]);
        if(i!=n-1)//这样是为了让结尾没有空格
            printf(" ");
    }
    return 0;
}

然后说一下这题的思路,题目的要求其实就是将数组左移m位,然后输出。

那么,我们其实可以先算出a[0]移动后的位置就是a[n-m](如输入样例中的8 3,左移三位后,a[0]元素的位置其实就移动到a[5]了),所以第一个for循环输入的是a[m-n]到a[n-1]的值,然后第二个for循环再从a[0]接着输入到a[m-n-1],最后再直接输出整个数组即可。

关于m>n的情况:当m>n的时候,我们可以发现,其实要左移的位置就是m%n(如n=3,m=4,其实就只需要左移4%3=1次),因为3个数左移3位还是本身,所以我们只需要在前面加一个判断,当m>n的时候,m=m%n就可以去掉多余无意义的左移。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现数组的循环移位的方法示例

    算法 Reverse Array (数组翻转) code void reverse(int array[], int left, int right) { int l, r; for (l = left, r = right; l < r; l++, r--) { array[l] = array[l] ^ array[r]; array[r] = array[l] ^ array[r]; // l ^ r ^ r = l ^ 0 = l. array[l] = array[l] ^ array

  • C语言数组元素的循环移位方法

    如下所示: /*C语言数组元素的循环移位*/ #include <stdio.h> int main() { int num[5],num1[5]; int i, j,k=1; int t,n; printf("请输入5个数:"); for(i=0;i<5;i++) { scanf("%d",&num[i]); //将数读入数组num } printf("请输入循环次数:"); scanf("%d",

  • C语言实现数组的循环左移,右移,翻转的示例

    数组结合指针可以实现很多有趣的功能,比如下面这个程序: 假设数组为 : 12345 如果左移一次即为:23451 ,依次类推 如果右移一次即为:51234 ,依次类推 翻转则为:54321 我们来实现下这个程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #define NR(x) (sizeof(x)/sizeof(x[0])) //数组左移 int buffer_left_move(int

  • c语言实现数组循环左移m位

    目录 c语言数组循环左移m位 数组循环左移的简单方法 输入格式 输出格式 c语言数组循环左移m位 #include<stdio.h> //函数原型 void rightshiftleft(int *p_num,int n,int m); void enterint(int *p_num,int n); //主函数 void main(){ int num[100] = {1,2,3,4,5},*p_num = num; int n = 5,m = 2; printf("Int =:&

  • python字符串循环左移

    本文实例为大家分享了python字符串循环左移的具体代码,供大家参考,具体内容如下 字符串循环左移 给定一个字符串S[0-N-1],要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符'a'.'b'移动到字符串的尾部,得到新字符串"cdefab":即字符串循环左移k位. 循环左移k位等价于循环右移n-k位. 算法要求: 时间复杂度为 O(n),空间复杂度为 O(1). 分析思路: 暴力移位: 每次循环左移1位,调用k次即可 时间复杂度O(kN

  • C/C++如何实现循环左移,循环右移

    目录 实现对一个无符号数的循环左移和循环右移 循环移位直接可用的函数(循环右移.循环左移) 整体代码 本文的小技巧 注意的地方 字符串循环左|右移实现(C/C++) 字符串循环右移K位 字符串循环左移K位 循环左右移结果相同条件 实现对一个无符号数的循环左移和循环右移 循环移位直接可用的函数(循环右移.循环左移) //val表示需要移位的数 n表示移位位数 //字节数乘以8代表一共多少位 //向右循环移n位的结果:假设数据一共size位,向左移size-n位,再与原数右移n位进行或操作的结果 /

  • C语言选择、循环、函数、数组与操作符

    目录 1.选择语句 2.循环语句 3.函数 4.数组 5.操作符 5.单目操作符 6.关系操作 7.逻辑操作符 8.条件操作符 9.逗号表达式 10.下标引用.函数调用和结构成员 1.选择语句 如果你好好学习,校招时拿一个好offer,走上人生巅峰.如果你不学习,毕业等于失业,回家卖红薯.这就是选择! #include<stdio.h> int main() {     int a = 0;     printf("1:好好学习,拿大厂offer     2.宿舍摆烂,毕业即失业\n

  • 详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令

    汇编语言是依赖于计算机的低级的程序设计语言. RCL(带进位循环左移)指令把每一位都向左移,进位标志位复制到 LSB,而 MSB 复制到进位标志位: 如果把进位标志位当作操作数最高位的附加位,那么 RCL 就成了循环左移操作.下面的例子中,CLC 指令清除进位标志位.第一条 RCL 指令将 BL 最高位移入进位标志位,其他位都向左移一位.第二条 RCL 指令将进位标志位移入最低位,其他位都向左移一位: clc                             ; CF = 0 mov bl

  • 关于C语言一维数组算法问题详解

    目录 问题1:将数组中的数逆序存放 问题2:求数组中最大值及其下标 问题3:找出不是两个数组的共有元素 问题4:找出出现次数最多的数 问题5:数组中插入数字并排序 问题6:数组循环右移问题 总结 问题1:将数组中的数逆序存放 本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放, 再按顺序输出数组中的元素. 算法描述:1.向数组a中输入元素: 2.定义一个新数组new,将数组a中的元素倒序存放: 3.将数组b正序输出,注意结尾无空格的格式问题. 代码实现 : #include

  • 深入解析PHP中foreach语句控制数组循环的用法

    foreach是PHP中很常用的一个用作数组循环的控制语句. 因为它的方便和易用,自然也就在后端隐藏着很复杂的具体实现方式(对用户透明) 今天,我们就来一起分析分析,foreach是如何实现数组(对象)的遍历的. 我们知道PHP是一个脚本语言,也就是说,用户编写的PHP代码最终都是会被PHP解释器解释执行, 特别的,对于PHP来说,所有的用户编写的PHP代码,都会被翻译成PHP的虚拟机ZE的虚拟指令(OPCODES)来执行,不论细节的话,就是说,我们所编写的任何PHP脚本,都会最终被翻译成一条条

  • C语言柔性数组实例详解

    本文实例分析了C语言柔性数组的概念及用法,对于进一步学习C程序设计有一定的借鉴价值.分享给大家供大家参考.具体如下: 一般来说,结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组.但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小以适应柔性数组的预期大小.柔性数组到底如何使用? 不完整类型 C和C++对于不完

随机推荐