利用操作符解题的精彩瞬间(上)

news2024/11/15 4:49:24

下面是链接为了解释练习2的并且还有与操作符相关的知识。 

C语言与操作符相关的经典例题-CSDN博客

操作符详解(上)-CSDN博客

操作符详解(下)-CSDN博客

目录

练习1:在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。

练习2:两个整数二进制位不同个数

练习3:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列


前言:有些题目可能我们想破脑袋也不知道怎么写,但是如果用一些看似奇怪的方法去写,就能有一种柳暗花明又一村的感觉。虽然这些代码是那些大牛想到的,但是只要我们坚持看这些大牛的代码,我们总可以多学到一点。(个人感想,可忽略。

步入正题:

练习1:在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。

这个题目是关键就是找到那个单独的数字。如果我们能想到用按位异或(^)的方法就比较简单了。

解题的知识储备:0 ^ n = n     n ^ n = 0   。

思路:我们可以先定义一个变量等于0,用它来异或数组里的数。由于0 ^ n = n,所以这个变量不影响最终的求值。(当然这一步如果简化就是把这个变量初始化为数组的第一个元素,而异或开始的是用第二个元素。)用循环产生这些数组的元素,当我们把它们全部异或到一起时,就可以用到n ^ n = 0,这个最终剩下的就是那个单独的数字,也就是我们要找的那个数。

上面这个就是原理图 。之所以可以这样做,是因为异或也满足交换律。

#include <stdio.h>
int FindNumber(int* p, int sz)
{
	int i = 0;
	int flag = 0;
	for (i = 0; i < sz; i++)
	{
		flag ^= *(p + i);
	}
	return flag;
}
int main()
{
	int arr[] = { 1,2,3,4,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = FindNumber(arr, sz);//因为要遍历数组,所以需要数组和数组的元素
	printf("%d\n", ret);
	return 0;
}
#include <stdio.h>
int FindNumber(int* p, int sz)
{
	int i = 0;
	int flag = 1;
	for (i = 1; i < sz; i++)
	{
		flag ^= *(p + i);
	}
	return flag;
}
int main()
{
	int arr[] = { 1,2,3,4,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = FindNumber(arr, sz);//因为要遍历数组,所以需要数组和数组的元素
	printf("%d\n", ret);
	return 0;
}

 第二个代码是用括号内写法的。

代码演示:

练习2:两个整数二进制位不同个数

两个整数二进制位不同个数_牛客题霸_牛客网

题目:

思路:题目是要求输入的两个数,二进制中又多少个比特位不相同。既然是让我们求两个数的二进制位不同个数,这里我们应该就可以联想到一个操作符:按位异或(^),相同的二进制位取0,不同的二进制位取1。我们就可以把这两个数按位异或存放到第三个数中,既然不同的二进制位是1,那么只要我们把这个1的个数统计出来了,也就意味着求出来二进制中不同位的个数了。

#include <stdio.h>
int Num(int c)
{
    int count = 0;
    while(c)
    {
        c = c & (c-1);//这一步如果看不懂的话,可以去看我前面的那一篇关于操作符的文章,我将链接放到文章的最前面了
        count++;
    }
    return count;
}
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d%d",&a,&b);
    int c = a ^ b;
    int ret = Num(c);//求二进制中一的个数(用函数来实现)
    printf("%d\n",ret);
    return 0;
}

之所以用函数的方法,是因为不想让这个主函数看起来很长,这样会影响代码的美观。

按位异或的思想其实就是在找不同,如果想要找到不同的地方,就可以使用按位异或的方法。

这个就类似题眼。

练习3:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

这个题目其实就是在变相的问一个整数二进制的0和1的个数并且按照奇偶打印出来。因为一个整数的二进制位要么是0,要么是1。那么我们怎么知道这个整数的二进制位是0还是1呢?这里就可以用按位与(&)来计算,当我们按位与上一个1是,如果这个位是0,那么最终的结果就是0;如果这个位是1,那么最终的结果就是1。这是第一位的结果,我们要的是32个位,那么就循环32次。我们只要分奇偶来按位与,并且输出就可以了。接下来,就是要分奇偶来讨论了。讨论奇数的时候怎么循环?偶数的时候怎么循环?我就用画图来描述:

根据8位,我们就可以推出32位的循环结果。如果i从0开始,那么结束的位置就都要减1。因为开始是0。

 代码演示:

#include <stdio.h>
void Get(int n)
{
	int i = 0;
	printf("奇数位:");
	for (i = 0; i < 31; i += 2)//打印奇数位
	{
		if (((n >> i) & 1) == 1)
		{
			printf("%d ", 1);
		}
		else
		{
			printf("%d ", 0);
		}
	}
	printf("\n");
	printf("偶数位:");
	for (i = 1; i < 32; i += 2)//打印偶数位
	{
		if (((n >> i) & 1) == 1)
		{
			printf("%d ", 1);
		}
		else
		{
			printf("%d ", 0);
		}
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Get(n);
	return 0;
}

其实这个还可以简化一点,既然 ((n >> i) & 1)的结果是1,就打印1;结果是0,就打印0。那么我们就直接把这个表达式当作是printf的参数就更好了。

#include <stdio.h>
void Get(int n)
{
	int i = 0;
	printf("奇数位:");
	for (i = 0; i < 31; i += 2)
	{
		printf("%d ", (n >> i) & 1);
	}
	printf("\n");
	printf("偶数位:");
	for (i = 1; i < 32; i += 2)
	{
		printf("%d ", (n >> i) & 1);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Get(n);
	return 0;
}

但是这里有的小伙伴可能会将1的位数给移动,因为移动1的位数相对比较简单。但是这个题目狡猾就狡猾在这里。你移动了那个位数之后,虽然比较出来的结果是1,但是它的权重变了,不再是2的0次方,而是2的1次方,2的2次方等等。这样写出来的程序就输出的不是1了。

#include <stdio.h>
void Get(int n)
{
	int i = 0;
	printf("奇数位:");
	for (i = 0; i < 31; i += 2)//打印奇数位
	{
		printf("%d ", n & (1 << i));
	}
	printf("\n");
	printf("偶数位:");
	for (i = 1; i < 32; i += 2)//打印偶数位
	{
		printf("%d ", n & (1 << i));
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Get(n);
	return 0;
}

我们输入的是7,输出的却是1,2,4,但是我们会发现两者之和相等。这就是因为权重的问题。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud微服务常见问题

1 微服务 返回面试宝典 问题1 SpringCloud常见组件有哪些&#xff1f; SpringCloud包含的组件很多&#xff0c;有很多功能是重复的&#xff0c;其中最常见的组件包括&#xff1a; 注册中心组件&#xff1a;Eureka、Nacos等&#xff1b;负载均衡组件&#xff1a;Ribbon&…

面试题 02.07. 链表相交(力扣LeetCode)

文章目录 面试题 02.07. 链表相交题目描述解题思路c代码优化后c代码 面试题 02.07. 链表相交 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 …

【Linux】—— 信号的产生

本期&#xff0c;我们今天要将的是信号的第二个知识&#xff0c;即信号的产生。 目录 &#xff08;一&#xff09;通过终端按键产生信号 &#xff08;二&#xff09;调用系统函数向进程发信号 &#xff08;三&#xff09;由软件条件产生信号 &#xff08;四&#xff09;硬件…

【学习笔记】Vue3源码解析:第一部分-实现vue3环境搭建

课程地址&#xff1a;【已完结】全网最详细Vue3源码解析&#xff01;&#xff08;一行行带你手写Vue3源码&#xff09; 第一部分&#xff1a;实现vue3环境搭建&#xff08;对应课程的第1-3节&#xff09; VUE2与VUE3的对比&#xff1a; 也即vue2的痛点&#xff1a; 对TypeSc…

vue3前端开发框架的安全特性,非常适合现在的市场需求

vue3前端开发框架的安全特性,非常适合现在的市场需求&#xff01;现在几乎所有的前端开发&#xff0c;都是使用的vue3做了开发。下面给大家展示一下。为什么说vue3框架自带安全特性呢。 如图&#xff0c;这个是我们在浏览器内看见的&#xff0c;渲染后的数据页面信息。很齐全。…

超越人类上限的策划:百度输入法在候选词区域植入广告

一位 V2EX 用户最新发帖称&#xff0c;百度输入法的最新版本中引入了一个新功能&#xff0c;将广告直接植入到候选词区域。 具体表现为&#xff0c;当用户输入某些关键词时&#xff0c;候选词区域会显示与输入内容相关的广告链接。例如&#xff0c;用户输入“招商”时&#xf…

【C++】类与对象(二)特殊成员函数

前言 类与对象&#xff08;二&#xff09; 文章目录 一、特殊成员函数二、构造函数三、析构函数四、拷贝构造函数五、拷贝赋值运算符 一、特殊成员函数 如果在类的声明中未显式提供某个成员函数的定义&#xff0c;编译器会自动生成一个默认实现。 这包括默认构造函数、默认析构…

Flutter 开发3:创建第一个Flutter应用

Step 1: 安装Flutter 1.1 下载Flutter SDK 首先&#xff0c;你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。 $ cd ~/development $ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip1.2 更新环境变量 接下来&#xff0c;你需要将Flutter…

笔记本电脑系统Win10重装教程

当前很多用户都会使用笔记本电脑办公&#xff0c;如果笔记本电脑携带的操作系统不好用&#xff0c;就会影响到用户的办公效率&#xff0c;这时候可以给笔记本电脑重新安装一款好用的系统。以下小编带来笔记本电脑系统Win10重装教程&#xff0c;让用户们轻松给笔记本电脑重新安装…

张维迎《博弈与社会》纳什均衡与囚徒困境博弈(2)囚徒困境博弈

囚徒困境大家应该都比较熟悉了&#xff0c;我觉得这篇的意义大概在与&#xff0c;经济学术语的运用&#xff1f; 囚徒困境&#xff1a;个人理性与集体理性的矛盾 假定有两个犯罪嫌疑人共同作案。警察抓住他们以后&#xff0c;分开拘押&#xff0c;并告诉他们&#xff1a;可以选…

GWIT 和GWFI

关于燃烧的历史&#xff1a; -UL request needle flame (open fire) test to rate flammability per UL-94 Vxx UL 要求针焰&#xff08;明火&#xff09;试验以评定UL-94的易燃性。 - industry recognized that glowing wires ( caused by electrical overload) may put …

《幻兽帕鲁》游戏公司如何打造全球爆款 《幻兽帕鲁Palworld》怎么在Mac上玩?

玩法融合之外&#xff0c;《幻兽帕鲁》设计的成功和难点其实是把大部分系统及玩法结合得更紧密&#xff0c;做到多个系统之间互相强化。 “下班&#xff0c;该当帕鲁训练家了。”近日&#xff0c;记者从多个游戏群中看到&#xff0c;《幻兽帕鲁》正在取代其他游戏&#xff0c;成…

蓝桥杯-常用STL(一)

常用STL &#x1f388;1.动态数组&#x1f388;2.vector的基础使用&#x1f52d;2.1引入库&#x1f52d;2.2构造一个动态数组&#x1f52d;2.3插入元素&#x1f52d;2.4获取长度并且访问元素&#x1f52d;2.5修改元素&#x1f52d;2.6删除元素&#x1f52d;2.7清空 &#x1f38…

抽象类(Java)、模板方法设计模式

一、概念 在Java中有abstract关键字&#xff0c;就是抽象的意思&#xff0c;可用来修饰类和成员方法。 用abstract来修饰类&#xff0c;那这个类就是抽象类&#xff1b;修饰方法&#xff0c;那这个方法就是抽象方法。 修饰符 abstract class 类名{修饰符 abstract 返回值类型…

知识库是什么 产品经理必须知道的行业知识

现如今&#xff0c;我们生活在一个知识爆炸的时代。对于产品经理来说&#xff0c;信息不再是稀缺资源&#xff0c;如何高效地管理和利用这些信息&#xff0c;是他们面临的重要问题。这时&#xff0c;知识库便悄然成为产品经理必备的工具。所以&#xff0c;什么是知识库呢&#…

Python网络拓扑库之mininet使用详解

概要 网络工程师、研究人员和开发人员需要进行各种网络实验和测试&#xff0c;以评估网络应用和协议的性能&#xff0c;以及解决网络问题。Python Mininet是一个功能强大的工具&#xff0c;它允许用户创建、配置和仿真复杂的网络拓扑&#xff0c;以满足各种实际应用场景。本文…

2024美赛备战--六大题型常用模型简要分析

美国大学生数学建模竞赛&#xff08;MCM&#xff09;是全球知名的数学建模比赛之一&#xff0c;每年都吸引了来自世界各地的学生参加。在这场充满挑战的竞赛中&#xff0c;参赛者将面对多种题目&#xff0c;需要利用他们的数学建模技能来解决实际问题。下面&#xff0c;建模忠哥…

深入了解Yum:Linux系统的软件包管理利器

目录 软件包 软件包的来源 关于yum yum是什么 yum的相关操作 介绍rzsz rz&#xff08;从Windows本地传到Linux服务器&#xff09; sz&#xff08;从Linux服务器传到Windows本地&#xff09; 注意事项 查看软件包 安装软件 卸载软件 yum的本地配置 为什么要进行配置…

Redis学习——高级篇④

Redis学习——高级篇④ Redis7高级之Redis与Mysql数据双写一致性工程案例&#xff08;四&#xff09; 4.1 MySQL主从复制原理4.2 canal 工作原理4.3 mySQL->canal->redis 双写一致性1.环境2.配置Mysql3.配置canal4. Canal客户端&#xff08;Java编写&#xff0…

03:华为云管理|云主机管理|云项目实战

华为云管理&#xff5c;云主机管理&#xff5c;云项目实战 安全组配置部署跳板机配置yum源&#xff0c;安装软件包优化系统服务安装配置ansible管理主机 模版镜像配置配置yum源&#xff0c;安装软件包优化系统 网站云平台部署实战华为云的负载均衡 安全组配置 设置安全组 云…