【C语言】操作符相关编程题

目录

题目一:

题目二:

题目三:

题目三:

题目四:

题目五:

题目六:

题目七:

题目八:


题目一:

题目:不创建临时变量,交换两个数。

思路:(方法一:交换律思想)

  • 先将两个数相加赋值给num1,此时num1为两数之和
  • 接着对赋值后的num1 - num2,即6-2,此时的结果就是一开始num1的值,赋值给num2此时num2存储了一开始num1的值
  • 最后两数之和 - num2,可以得出一开始num2的值,赋值给num1,就完成交换
  • 缺陷:可能溢出,当两个数太大时,相加可能超出整形大小
#include<stdio.h>

//不创建临时变了,交换两个数
int main()
{
	int num1 = 4;
	int num2 = 2;
	printf("交换前:%d %d\n", num1, num2);
	num1 = num1 + num2;
	num2 = num1 - num2;
	num1 = num1 - num2;
	printf("交换后:%d %d\n", num1, num2);
	return 0;
}

思路:(方法二:异或操作符法)

  • 异或的特殊性:
  1. 两个相同的数进行异或 == 0,因为异或是相同为0,相异为1.
  2. n^0 == n,为什么?因为0的二进制为32个0,则任何数的二进制要么为0要么1,当对应二进制位为0时,则为0,为1时,则为1,本质上没有改变。
  3. 异或支持交换律,如:3^5^3 == 5 等价于 3^3^5 == 5
#include<stdio.h>

//不创建临时变了,交换两个数
int main()
{
	int num1 = 4;
	int num2 = 2;
	printf("交换前:%d %d\n", num1, num2);
	num1 = num1 ^ num2;
	num2 = num1 ^ num2; //拆分成:num2 = num1^num2^num2 异或支持交换律,因此值为变化前的num1
	num1 = num1 ^ num2; //拆分成:num1 = num1^num2^num2(num1),num2的值其实就是变化前的num1,
	//因此值为变化前的num2
	printf("交换后:%d %d\n", num1, num2);
	return 0;
}


题目二:

题目:编写代码实现:求一个整数存储在内存中的二进制中1的个数。

思路1:

  • 题目要求统计一个整数的二进制中有多少个1.
  • 对该整数按位与上一个1即可。
  • 按位与:对二进制进行操作,一个为0,结果为0,两个为1才为1.
  • 因此对一个数按位与1,可以判断该数的最低位是否为1.
  • 判断完之后对该数进行右移操作,移动1位,持续对最低位进行判断。
#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int count = 0;

	//循环32次是因为一个整数4字节,32比特,由32个二进制组成
	for (int i = 0; i < 32; i++)
	{
		//n&1,判断最低位是否为1
		if (n & 1)
		{
			count++;
		}
		//无论最低位是1还是0,均更新最低位,即右移
		n = n >> 1;
	}
	printf("%d的二进制中有:%d个1\n", n, count);
	
	return 0;
}

思路2:采用相邻的两个数进行按位与操作(非常高效)

  • &:1个0都为0,两个1才为1
  • res和res-1的二进制有什么区别?假设res==3
  • res:....011;res-1:....010
  • res&res-1结果:010,因此可以得出,一个res-1后,得到的二进制位将是res二进制最右侧的1变为0的二进制
  • 再进行&操作后,就能得到res二进制位中将1个1变为0的二进制数
  • 因此,只要不断的重复,当最后res变为0了,也就说明res中的1被全部去除
  • 因此循环多少次,就代表res中1的个数
#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int count = 0;
	while(n)
    {
        n = n & (n-1);
        count++;
    }    
	printf("%d的二进制中有:%d个1\n", n, count);
	return 0;
}

题目三:

题目:假设把一个数的二进制中某一位改为1,其它位不变

思路:

  • 利用位操作符的特性,对该数的二进制中第n位进行按位或1操作,其它位均或0,则只会改变第n位上的二进制为1.
  • 按位或:一个为1则为1,两个为0才为0.
  • 对第n位按位或1,当第n位时1时,则为1,是0时,也为1.
  • 如何得到这个二进制序列呢?通过对1左移n-1位。
#include <stdio.h>
int main()
{
	int num = 0;
    int n = 0;
    scanf("%d %d", &num, &n);
	//对num二进制中第n修改为1
	num = num | (1 << n-1);
	printf("%d\n", num);
	return 0;
}

如果现在又想将该位改为0该怎么做?也就是对一个数的某个二进制为改为0

思路:

  • 同样的,针对于二进制中的某一位,那对该位按位与0。
  • 按位与:一个为0则为0,两个为1才为1。
  • 如果该位是1,那按位与0则为0,如果该位是0,那按位与0也为0.
  • 如何得到这个二进制序列呢?分为两步:
  • 首先得到刚刚对某一位二进制改为1的二进制序列,对它进行取反操作。说简单点就是对1左移n-1位。
  • 对该二进制序列按位取反操作。
#include <stdio.h>
int main()
{
	int num = 0;
    int n = 0;
    scanf("%d %d", &num, &n);
	//对num二进制中第n修改为1
	num = num | (1 << n-1);
	printf("将该位改为1:%d\n", num);
    num = num & (~(1<<n-1));
    printf("将该位改为0:%d\n", num);
	return 0;
}


题目三:

题目:打印整数二进制的奇数位和偶数位

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

思路:

  • 获取一个数二进制位中的最低位:n & 1,能得出n的最低位是0还是1.
  • 因此计算一个数二进制的偶数位和奇数位,只需要控制好每次按位与第几个二进制位就可以了。
  • 奇数位:写得出高位中最后一个奇数位,即第31位,打印后,不断-2得到下一个奇数位,这就需要通过>>操作符了。
  • 偶数位:同样的,写对第32位进行打印,再不断-2得到下一个偶数位。通过>>操作符。
#include <stdio.h>
int main()
{
	int a = 2; //010
	//获取二进制的偶数位
	for (int i = 31; i >= 1; i-=2)
	{
		printf("%d ", (a >> i) & 1);
	}
	printf("\n");
	//获取二进制的奇数位
	for (int i = 30; i >= 0; i-=2)
	{
		printf("%d ", (a >> i) & 1);
	}
	return 0;
}

题目四:

题目:两个整数二进制位不同个数_牛客题霸_牛客网 (nowcoder.com)

描述:

输入两个整数,求两个整数二进制格式有多少个位不同

输入描述:

两个整数

输出描述:

二进制不同位的个数

示例:

输入:22 33

输出:5

思路:

分为两部分:

  • 对两个整数进行异或操作,因为异或的特点为:相同为0,相异为1。因此结果中二进制位1的个数就是不同的个数。
  • 统计res中有几个1。
#include <stdio.h>
int Comp_func(int res)
{
	//方法一:>>和&操作
	//检查res中的二进制位有几个1,就是不同的个数
	//res&1能得到最低位是0还是1,int32个二进制位,那就不断更新最低位进行&
	//如何不断得到最低位呢?res>>i
	int count = 0;
	// for (int i=0; i<32; i++) {
	//     if ((res>>i)&1) {
	//         count++;
	//     }
	// }
	//方法二:利用&的特性,对两个相邻的数进行&操作(非常高效)
	//&:1个0都为0,两个1才为1
	//res和res-1的二进制有什么区别?假设res==3
	//res:....011;res-1:....010
	//res&res-1结果:010,因此可以得出,一个res-1后,得到的二进制位将是res二进制最右侧的1变为0的二进制
	//再进行&操作后,就能得到res二进制位中将1个1变为0的二进制数
	//因此,只要不断的重复,当最后res变为0了,也就说明res中的1被全部去除
	//因此循环多少次,就代表res中1的个数
	while (res) {
		res = res & (res - 1);
		count++;
	}
	return count;
}
int main() {
	int a, b;
	scanf("%d %d", &a, &b);
	//a^b, 异或的特点:相同为0,相异为1
	//a^b 后,相同的二进制位变为0,不同的变为1
	int count = Comp_func(a ^ b);
	printf("%d\n", count);
	return 0;
}

题目五:

题目:有序序列合并_牛客题霸_牛客网 (nowcoder.com)

描述:

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:输入包含三行
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
输出描述:输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。

示例:
输入:
5 6
1 3 7 9 22
2 8 10 17 33 44
输出:
1 2 3 7 8 9 10 17 22 33 44

思路:

  1. 定义一个n+m大小的数组res
  2. 依次将n和m个整数输入到res中
  3. 对res进行冒泡排序
#include <stdio.h>
int main() {
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int res[n+m];
    for (int i = 0; i < n; i++) {
        scanf("%d", &res[i]);
    }
    for (int i = n; i < n + m; i++) {
        scanf("%d", &res[i]);
    }
    //排序,冒泡排序(升序)
    //外层循环控制趟数,内存循环控制一趟的比较次数
    for (int i = 0; i < n + m - 1; i++) {
        for (int j = 0; j < n + m - 1 - i; j++) {
            //升序
            if (res[j] > res[j + 1]) {
                int tmp = res[j];
                res[j] = res[j + 1];
                res[j + 1] = tmp;
            }
        }
    }
    for (int i = 0; i < n + m; i++) {
        printf("%d ", res[i]);
    }
}

题目六:

题目:小乐乐走台阶_牛客题霸_牛客网 (nowcoder.com)

描述:

小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?
输入描述:输入包含一个整数n (1 ≤ n ≤ 30)
输出描述:输出一个整数,即小乐乐可以走的方法数。

示例1:

输入:2
输出:2

示例2:

输入:10
输出:89

思路:参考【C语言】青蛙跳台阶问题-CSDN博客

  • n==1,只有1种跳法
  • n==2,只有两种跳法
  • n>2时,统计只走一阶台阶的方法 + 只走两阶的方法 == 总走法
  • 递归
#include <stdio.h>
int function(int n)
{
	//n为1时,只有1种走法
	if (n == 1) {
		return 1;
	}
	//n为2时,只有2种走法
	if(n == 2) {
		return 2;
	}
	//n>2时,统计只走一阶台阶的方法 + 只走两阶的方法 == 总走法
	//需要用到递归
	return function(n-1) + function(n-2);
}
int main()
{
	//青蛙跳台阶问题
	int n = 0;
	scanf("%d", &n);
	int count = function(n);
	printf("%d\n", count);
	return 0;
}

题目七:

题目:变种水仙花_牛客题霸_牛客网 (nowcoder.com)

描述:

变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。

例如:

655 = 6 * 55 + 65 * 5

1461 = 1*461 + 14*61 + 146*1

求出 5位数中的所有 Lily Number。

输入描述:

输出描述:

一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格。

思路:

运用%和/操作符,不断得到每个位数,如:n=12345,n%10==5,n/10=1234,进行相乘n%100=45,n/100=123,进行相乘.....依此类推

#include <stdio.h>
int main()
{
	for (int i=10000; i<=99999; i++) {
		
		//统计每个数拆分相乘后相加的值
		int sum = 0;
		for (int j=10; j<=10000; j*=10) {
			sum += (i/j) * (i%j); 
		}
		//判断sum是否等于i,如果是,则符合
		if (sum == i) {
			printf("%d ", i);
		}
	}

	return 0;
}

题目八:

题目:三角形判断_牛客题霸_牛客网 (nowcoder.com)

描述:

KiKi想知道已经给出的三条边a,b,c能否构成三角形,如果能构成三角形,判断三角形的类型(等边三角形、等腰三角形或普通三角形)。

输入描述:

题目有多组输入数据,每一行输入三个a,b,c(0<a,b,c<1000),作为三角形的三个边,用空格分隔。

输出描述:

针对每组输入数据,输出占一行,如果能构成三角形,等边三角形则输出“Equilateral triangle!”,等腰三角形则输出“Isosceles triangle!”,其余的三角形则输出“Ordinary triangle!”,反之输出“Not a triangle!”。

思路:

构成三角形的要求:两边之和大于第三边

三角形的类型:

  • 等腰三角形:两边相等
  • 等边三角形:三边相等
  • 普通三角形:三边均不相等
#include <stdio.h>
int main() {
    //三边
    int a = 0;
    int b = 0;
    int c = 0;
    while (scanf("%d %d %d", &a, &b, &c) == 3) {
        //首先判断是否能构成三角形
        if (a + b > c && a + c > b && b + c > a) {
            //此时至少两条边相等,但也可能三条边相等
            if (a == b || a == c || b == c) {
				//三边相等-->等边三角形
				if (a == b && b == c) {
                	printf("Equilateral triangle!\n");
				}else { //等腰三角形
                	printf("Isosceles triangle!\n");	
				}
            }
			else {
                printf("Ordinary triangle!\n");
            }
        } else {
            printf("Not a triangle!\n");
        }
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码托管基础操作

在待上传代码文件夹中右键&#xff0c;打开Git Bash Here依次输入以下命令&#xff1a; git init(在本地初始化一个代码仓库&#xff0c;具体表现为会在你的文件夹里出现一个隐藏的.git文件夹) git add .&#xff08;先把代码放到本地的一个缓冲区&#xff09;添加当前目录下的…

Windows使用freeSSHd搭建sftp服务器

一、安装 1、运行freeSSHd.exe&#xff08;最好以管理员方式运行&#xff09; 2、选择安装位置 3、选择全部安装 4、是否创建开始启动栏快捷入口 5、是否创建桌面快捷方式 6、安装 7、安装完成&#xff0c;点击close 8、安装私钥 9、是否要安装为服务 10、全部安装完成 二、配…

查找输入整数的二进制中1的个数

方法1&#xff1a;简单做法&#xff0c;直接用库函数 #include<bitset> #include<iostream> using namespace std; int main(){int n;while(cin>>n){bitset<32> b(n);cout<<b.count()<<endl;} }补充bitset //注意&#xff1a;直接输出 b…

EasyExcel导出图片并实现动态表头、自动合并单元格、给指定单元格设置值

概要描述 最近工作中涉及到使用Excel导出图片的需求,下面对使用Excel导出图片遇到的一些问题进行记录说明。需求通过 EasyExcel中提供的转换器(Converter)和拦截器(Handler)实现。EasyExcel 官网地址 实现效果 实现过程 EasyExcel 支持导出 ByteArray、File、String、In…

软件缺陷和测试用例

软件缺陷 软件缺陷概念 Bug有时也被泛指因软件产品内部的缺陷引起的软件产品最终运行时和预期属性的偏离。 产生原因 1.需求不明确2.软件结构复杂3.编码问题4.项目期限短5.使用新技术 类型 错误、遗漏、额外实现 准则 Correct&#xff08;准确&#xff09;&#xff1a;…

一堆喷儿香喷儿香的工具网站-已经收藏-搜嗖工具箱!

文心一言 https://yiyan.baidu.com/ ​ ChatGpt横空出世的横空出世好像一把钥匙&#xff0c;开启了大模型时代&#xff0c;国内也有不错的产品&#xff0c;比如百度的文心一言&#xff0c;从3.5到4.0看得见的成长&#xff0c;现在的文心一言是我们工作中不可缺少的好帮手&am…

基于单片机的智能病床呼叫系统设计与仿真

摘 要 本文设计的病床呼叫系统采用单片机作为控制器。该系统具有远程控制、病人的身体情况检测、报警呼叫、显示和执行器运动的功能。远程控制由红外线传感器和矩阵键盘组成&#xff0c;检测电路由温湿度传感器DH22、心率传感器Pulse Sensor、压力传感器MPX4115组成&#x…

uniapp 如何区分目前运行环境(app、web、mp-weixin)

platform 区分 iOS、Android uniplatform 区分 app、web、mp-weixin ....

JavaEE 初阶篇-深入了解 File 文件操作(实现文件搜索、非空文件夹删除)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 File 文件概述 2.0 创建 File 类对象的方法 2.1 判断文件类型、获取文件信息的方法 2.2 创建文件、删除文件的方法 2.3 遍历文件夹的方法 3.0 文件搜索与删除 3.1…

学习笔记<2024.4.15-2024.4.21>:Attention Is All You Need

Transformer中Self-Attention以及Multi-Head Attention详解 (https://www.bilibili.com/video/BV15v411W78M/?spm_id_from333.337.search-card.all.click&vd_sourcef32decb03075b4a1833fe5c47c11ba94)

在线拍卖系统,基于SpringBoot+Vue+MySql开发的在线拍卖系统设计和实现

目录 一. 系统介绍 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 前台首页功能模块 2.4. 部分代码实现 一. 系统介绍 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系…

Axure琐碎细节

文章目录 琐碎细节注释预览编写原型图的时候可以把颜色改为灰色标尺竖直文字左对齐Axure中的文字怎么添加元件层级问题如何找到各种各样的形状&#xff0c;比如三角形了 五角星了 十字架了给按钮设置简单的交互动作通过锁来等比例缩放 琐碎细节 注释 有时候我们需要给我们的元…

windows驱动开发-WDM框架(一)

在前面的文章中解释过&#xff0c;NT5.0之后windows确定了新的架构Windows Driver Model (WDM)&#xff0c;在Vista之后又推出了Windows Driver Framework(WDF)&#xff0c;这两个都属于驱动程序框架&#xff0c;那么它们的之间的关系是怎样的&#xff1f; WDF是对WDM进行的封…

Linux--基础IO(上)

目录 1. 文件的边角知识 1.1 文件是什么&#xff1f; 1.2 文件是怎么打开的&#xff1f; 1.3 进程与文件 进程与文件的关系 2. 重温c语言文件接口 2.1 打开文件的方式 2.2 读写文件接口的重温 2.2.1 写文件 2.2.2 读文件 3. 系统文件I/O 3.1 系统接口 3.2 系…

OpenVINO安装教程 npm版

从 npm Registry安装 OpenVINO™ 工具套件的英特尔发行版 请注意&#xff1a; 仅提供 JavaScript API 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; macOS 仅支持 CPU 推理 系统要求软件要求 Window…

Python --- 在python中安装NumPy,SciPy,Matplotlib以及scikit-learn(Windows平台)

在python中安装NumPy&#xff0c;SciPy&#xff0c;Matplotlib以及scikit-learn(Windows平台) 本文是针对(像我一样的)python新用户所写的&#xff0c;刚刚在电脑上装好python之后&#xff0c;所需的一些常见/常用的python第三方库/软件包的快速安装指引。包括了这些常用安装包…

【AI自媒体制作】【AI工具】天工AI

链接&#xff1a;天工AI 目前chatgpt3.5已经免费&#xff0c;很多AI平台都可以进行一定层度的白嫖&#xff0c;对于个人开发者是一件好事&#xff0c;有些会员就没必要充值了。 天工AI是比较常见的AI工具了&#xff0c;可以识别图片、智能问答、生成图片等。当然对于一个程序员…

【Linux】git

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux的编译器-gcc/g&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1.安装git2.在gitee上创建仓库3.首次配置4.下载仓库到本地5.三板斧6.git log7.gi…

【数据结构】二叉爆炸

【数据结构】二叉爆炸 按照惯例整点抽象的&#xff0c;贴上这篇博客的名字由来&#xff1a; 言归正传&#xff0c;本篇博客介绍二叉树的构造方式、前中后序遍历、层序遍历以及代码随想录中二叉树章节的相关题目&#xff1a; 代码随想录 (programmercarl.com) 一、啥是二叉树 …

HDMI to TYPE-C芯片|HDMI2.0转TYPE-C转接器方案|CS5802设计方案|ASL CS5802

CS5802输入端可以是1080P、4K30、4K60HZ这三种规格,输出的接口可以是TYPE-C信号接口,或者是TYPE-C信号接口,输入端HDMI由4路信号组成&#xff0c;支持1.62Gbps、2.7Gbps、5.4Gbps链路速率。内置可选SSC功能可降低EMI的干扰状况。 ASL CS5802芯片概述&#xff1a; 符合HDMI规范…