精华内容
下载资源
问答
  • 循环右移

    2021-03-10 18:05:55
    循环右移 【问题描述】 假设有一16位的无符号整数,可以对其二进制数据进行循环右移操作,右移后仍然是无符号整数。编写程序从控制台读入要右移的整数和循环右移的位数,求得并输出循环右移后的十进制数据。 【输入...

    4. 循环右移

    【问题描述】

    假设有一16位的无符号整数,可以对其二进制数据进行循环右移操作,右移后仍然是无符号整数。编写程序从控制台读入要右移的整数和循环右移的位数,求得并输出循环右移后的十进制数据。

    【输入形式】

    从控制台输入要右移的十进制整数(大于等于0,小于等于65535)和循环右移的位数(大于等于0,小于等于16),两整数之间用一个空格分隔。

    【输出形式】

    向控制台输出循环右移后的十进制整数。

    【输入样例1】

    65532 2
    

    【输出样例1】

    16383
    

    【样例1说明】

    输入的待右移的整数为65532,该无符号整数的二进制形式为:1111111111111100,向右循环右移两位后的二进制形式为:0011111111111111,对应的十进制数据为:16383。

    【输入样例2】

    6 3
    

    【输出样例2】

    49152
    

    【样例2说明】

    输入的待右移的整数为6,该无符号整数的二进制形式为:0000000000000110,向右循环右移3位后的二进制形式为:1100000000000000,对应的十进制数据为:49152。

    【评分标准】

    该题要求编程求得循环右移后的数据,提交程序文件名为shift.c。

    思路

    输入整数为16位,最大为2的16次方;
    每次循环判断各个位置是0或者1,是1则右移n位.

    解题代码

    //优美的代码
    #include<bits/stdc++.h>
    using namepsace std;
    int main()
    {
        int x,n;
        cin>>x>>n;
        int ans=0;
        for(int i=15;i>=0;i--)if(x>>i&1)ans+=1<<(i-n+16)%16;
        cout<<ans<<endl;
    }
    
    

    优化:很明显,位为0不用加,所以可以用lowbit函数.

    
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int x,n;
        cin>>x>>n;
        int ret=0;
        while(x)
        {
            int t=(x&(-x))>>n;
            if(t)ret+=t;
            else ret+=(x&(-x))<<(16-n);
            x-=x&(-x);
        }
        cout<<ret<<endl;
    }
    
    
    展开全文
  • 循环右移.

    2021-05-29 18:38:40
    问题描述:假设有一16位的无符号整数,可以对其二进制进行循环右移操作,右移后任然是无符号整数,编写程序从控制台读入要右移的整数和循环右移的位数,求得并输出循环右移后的十进制数据。 输入形式:从控制台输入...

    问题描述:假设有一16位的无符号整数,可以对其二进制进行循环右移操作,右移后任然是无符号整数,编写程序从控制台读入要右移的整数和循环右移的位数,求得并输出循环右移后的十进制数据。
    输入形式:从控制台输入要右移的十进制整数(大于等于0,小于等于65535)和循环右移的位数(大于等于0,小于等于16),两整数之间用一个空格分隔。
    输出形式:向控制台输出循环右移后的十进制整数
    样例输入:6 3
    样例输入:49152
    样例说明:输入的待右移的整数为6,该无符号整数的二进制形式为:0000000000000110,向右循环右移3位后的二进制形式为:1100000000000000,对应的十进制数据为:49152

    //大佬的代码
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n,k;cin>>n>>k;
        int temp= n % (int)pow(2,k);
        cout<< (temp<<(16-k)+ (n>>k))<<endl;  //左移和右移运算符
        
        return 0;
    }
    
    //我的代码
    #include<bits/stdc++.h>
    using namespace std;
    const int MAX = 16;
    
    int binary_to_decimal(string a)    //将二进制字符串转换成十进制的整数
    {
    	int len = a.length();
    	int sum = 0;
    	for (int i = 0; i < len; i++)
    	{
    		sum += atoi(a.substr(len - i - 1,1).c_str())*pow(2, i);    //int atoi(const char* nptr) ,参数必须是c字符串!
    	}                                                              //使用substr成员函数提取出来的是C++字符串,需要将其转换成c字符串                                
    	return sum;
    }
    
    int main()
    {
    	int num, pos_float;
    	cin >> num >> pos_float;
    	char old_str[MAX];
    	itoa(num, old_str, 2);      //进制转换,num为目标数,old_str是保存进制转换后的字符串(必须是c字符串),2是目标进制
    
    	string new_str;
    	new_str = old_str;          //将C字符串转换成C++字符串
    
    	string str1 = "";
    	for (int i = 0; i < 16 - new_str.length(); i++)  //补0,使二进制数为16位
    	{
    		str1 += "0";
    	}
    	new_str = str1 + new_str;
    
    	string part1_str = new_str.substr(MAX - pos_float);  //进行移动
    	string part2_str = new_str.substr(0, MAX - pos_float);
    
    	new_str = part1_str + part2_str;
    
    	cout << binary_to_decimal(new_str) << endl;
    	
    	return 0;
    }
    

    仍需努力!!!

    展开全文
  • 数组循环右移.sln

    2019-08-16 17:23:41
    数组循环右移代码,PAT原题,复杂度小很多
  • 数组循环右移

    千次阅读 2019-09-03 19:07:39
    数组循环右移问题:给定一个长度为n的数组,将其向右循环移动k位得到一个新的数组。要求空间复杂度为O(1)。(此题为LeetCode上的编程题,但是在我遇到多益网络的面试之前我是不知道此题是LeetCode上的,所以当时我并...

            数组循环右移问题:给定一个长度为n的数组,将其向右循环移动k位得到一个新的数组。要求空间复杂度为O(1)。(此题为LeetCode上的编程题,但是在我遇到多益网络的面试之前我是不知道此题是LeetCode上的,所以当时我并不清楚此题的算法)

            例:长度为n=5的数组a的元素为{1,2,3,4,5},将其右移k=3位后得到{3,4,5,1,2}。其移动过程为{1,2,3,4,5}向右移动一位得到{5,1,2,3,4},向右移动两位得到{4,5,1,2,3},则向右移动三位得到{3,4,5,1,2}。由于当时面试之前我并没有见过此题,所以一时半会想不到算法,但之后发现此题并不难,完全可以看做普通的数组逆序来处理。循环右移k位,则数组中前n-k个元素会被移动,同时数组中最后k位的元素将会被移动到数组开始的位置。那么我们可以将原始数组分为两部分进行单独处理,先将数组中前n-k个元素进行逆序,之后再将最后的k个元素进行逆序,最后将整个数组再进行一次逆序即可。这样的话,其对应的代码为:

    #include <stdio.h>
    void Right_Move(int a[], int n, int k)
    {
        while (n < k)
        {
    	int temp = a[n];
    	a[n] = a[k];
    	a[k] = temp;
    	n++;
    	k--;
        }
    }
    int main()
    {
        int a[] = { 1, 2, 3, 4, 5 };
        int len = sizeof(a) / sizeof(a[0]);
        printf("原始数组为:\n");
        for (int i = 0; i < len; i++)
        {
    	printf("%d ", a[i]);
        }
        printf("\n");
        int k = 3;
        Right_Move(a, 0, len - k - 1);
        Right_Move(a, len - k, len - 1);
        Right_Move(a, 0, len -  1);
        printf("循环右移%d位后:\n", k);
        for (int i = 0; i < len; i++)
        {
    	printf("%d ", a[i]);
        }
        printf("\n");
        return 0;
    }

    展开全文
  • 数组循环右移 本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a​0​​a​1​​⋯a​n−1​​)变换为(a​n−m​​⋯...

    数组循环右移

     

    本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a​0​​a​1​​⋯a​n−1​​)变换为(a​n−m​​⋯a​n−1​​a​0​​a​1​​⋯a​n−m−1​​)(最后m个数循环移至最前面的m个位置)。

    函数接口定义:

    int ArrayShift( int a[], int n, int m );

    其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。

    裁判测试程序样例:

    #include <stdio.h>
    #define MAXN 10
    
    int ArrayShift( int a[], int n, int m );
    
    int main()
    {
        int a[MAXN], n, m;
        int i;
    
        scanf("%d %d", &n, &m);
        for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
    
        ArrayShift(a, n, m);
    
        for ( i = 0; i < n; i++ ) {
            if (i != 0) printf(" ");
            printf("%d", a[i]);
        }
        printf("\n");
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */

    输入样例:

    6 2
    1 2 3 4 5 6

    输出样例:

    5 6 1 2 3 4

     

     

    代码:

    #define MAXN 10
    int ArrayShift(int a[], int n, int m);
    
    int main()
    {
    	int a[MAXN], n, m;
    	int i;
    
    	scanf("%d %d", &n, &m);
    	for (i = 0; i < n; i++) scanf("%d", &a[i]);
    
    	ArrayShift(a, n, m);
    
    	for (i = 0; i < n; i++) {
    		if (i != 0) printf(" ");
    		printf("%d", a[i]);
    	}
    	printf("\n");
    	system("pause");
    	return 0;
    }
    
    int ArrayShift(int a[], int n, int m) {
    	int i, j;
    	m = m % n;								//移动n个回复原位 
    	int temp[100];							//定义temp[] 用他去操作重写的过程
    	for (j = 0; j < n; j++) {				//遍历赋值temp[]
    		temp[j] = a[j];
    	}
    	for (i = 0; i < n; i++) {
    		if (i >= (n - m)) {					//类似于一个连接字符串的操作
    			a[i + m - n] = temp[i];			//从尾部再重返头部
    		}
    		else {								//正常情况下 不涉及越界
    			a[i + m] = temp[i];
    		}
    	}
    }

    要学会m=m%n;这个思想

    重写字符串思想,即新定义一个字符串,用老字符串赋值后去操作老字符串。

    以及如何判断元素是否需要从尾部到头部的转移。

     

    类似题目:练习7-8 方阵循环右移

    本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

    输入格式:

    输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。

    输出格式:

    按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。

    输入样例:

    2 3
    1 2 3
    4 5 6
    7 8 9

    输出样例:

    2 3 1 
    5 6 4 
    8 9 7 

     

    之前写的破烂:

    #include<stdio.h>
    int main()
    {
    	int a[7][7];
    	int m, n, k, s, i, j, u, p;						//定义了8个变量 还每个都有用就牛逼
    	scanf("%d %d", &m, &n);
    	p = 1;											//立个flag
    	if (m > n&&m%n != 0) {							//如果m整除了
    		u = m % n;									//需要这个操作好像是因为后面的操作是让元素左移而不是右移
    		m = n - u;
    		p = 2;										//立flag
    	}
    	for (i = 0; i < n; i++) {						//读矩阵
    		for (j = 0; j < n; j++) {
    			scanf("%d", &a[i][j]);
    		}
    	}
    	for (i = 0; i < n; i++) {
    		for (j = 0; j < n; j++) {
    			s = j;
    			for (k = 0; k < m&&m%n != 0; k++) {
    				if (p == 1) {						//看不懂了不想看了
    					s = j;
    				}
    				if (s == n - 1) {
    					s = s - n + 1;
    				}
    				else {
    					s++;
    				}
    			}
    			printf("%d ", a[i][s]);					//一行一行移 移完一行就printf
    		}
    		printf("\n");
    	}
    	system("pause");
    	return 0;
    }

     

    也不知道当时怎么写的。。也是过了。。

     

     

    重新写的:

    #include<stdio.h>
    int main()
    {
    	int a[7][7];
    	int m, n;
    	scanf("%d %d", &m, &n);
    	int i, j;
    	//读矩阵
    	for (i = 0; i < n; i++) {
    		for (j = 0; j < n; j++) {
    			scanf("%d", &a[i][j]);
    		}
    	}
    	//再定义一个矩阵并赋值
    	int b[7][7];
    	for (i = 0; i < n; i++) {
    		for (j = 0; j < n; j++) {
    			b[i][j] = a[i][j];
    		}
    	}
    	//重写
    	for (i = 0; i < n; i++) {
    		for (j = 0; j < n; j++) {
    			m = m % n;
    			if (j >= (n - m)) {
    				a[i][j + m - n] = b[i][j];
    			}
    			else {
    				a[i][j + m] = b[i][j];
    			}
    		}
    	}
    
        //输出
    	int cnt = 0;
    	for (i = 0; i < n; i++) {
    		for (j = 0; j < n; j++) {
    			printf("%d ", a[i][j]);
    			cnt++;
    			if (cnt == n) {
    				cnt = 0;
    				printf("\n");
    			}
    		}
    	}
    	
    	system("pause");
    	return 0;
    }

     

    逻辑至少清晰了。。

     

    展开全文
  • 32位数循环右移

    2012-12-17 00:59:12
    在C语言中,用简单的逻辑实现32位数的循环右移
  • LED灯循环右移程序

    2015-02-12 19:51:41
    8位LED循环右移,只有1位始终点亮。使用For循环移位。
  • 字符串循环右移

    2020-01-09 11:28:03
    文章目录1 字符串循环右移1.1 字符串循环右移 1 字符串循环右移 1.1 字符串循环右移 题目: 代码实现: #include <stdio.h> #include <string.h> void right_shift_r(const char* src, char* result, ...
  • 用LCD循环右移显示Welcome to China
  • 今天小编就为大家分享一篇解决C语言数组元素循环右移的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 主要介绍了C语言数组元素循环右移问题,本文通过多种方法给大家分享解决方案,通过实例代码讲解,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
  • 循环右移数组

    2018-03-04 15:32:00
    数组循环右移 设计算法,实现把一个含有N个元素的数组循环右移K位,要求时间复杂度\(O(n)\),并且,不能使用额外的数组 由浅入深 解法一:每次右移一位,循环K次 假设数组中元素为abcd1234,那么这个步骤大致上是 ...
  • PAT 乙级 1008 数组循环右移 处理循环右移的套路 数组长度为n,要把数组循环右移m位,只用把数组倒置,然后把数组前m位倒置,在把数组后n-m位倒置即可。 注意m可能大于n,循环右移m位相当于循环右移m%n位,循环右移n...
  • 循环移位:循环左移和循环右移

    万次阅读 多人点赞 2018-04-30 15:35:46
    换句话说,循环移位就是将移出的低位放到该数的高位(循环右移)或把移出的高位放到该数的低位(循环左移),左移,和右移动都是对整数进行的操作,在Win32控制台应用程序中,整形占4Byte节32bit。 &nbsp; &...
  • 数组元素循环右移

    2020-06-08 11:56:24
    请设计一C语言函数(注:只须写出函数,不必写出完整程序),该函数的功能是用尽可能高的时间效率与空间效率将一个int类型的数组A[0…n-1]的所有元素依次循环右移k个位置。 例如,对于某数组,当k=3时(即把数组所有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,082
精华内容 24,432
关键字:

循环右移