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

news2024/12/25 18:23:25

目录

题目一:

题目二:

题目三:

题目三:

题目四:

题目五:

题目六:

题目七:

题目八:


题目一:

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

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

  • 先将两个数相加赋值给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;
}

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

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

相关文章

第一届 _帕鲁杯_ - CTF挑战赛

Mis 签到 题目附件&#xff1a; 27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 2…

Spring Boot集成zipkin快速入门Demo

1.什么zipkin Zipkin是一款开源的分布式实时数据追踪系统&#xff08;Distributed Tracking System&#xff09;&#xff0c;基于 Google Dapper的论文设计而来&#xff0c;由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。Zipkin默认支持Http协议&…

提取出图像的感兴趣区域

这是我们的原图像 将图像的数值统计后进行条形图展示 import matplotlib.pyplot as plt from PIL import Image import numpy as np# 图像路径 image_path r"D:\My Data\Figure\OIP.jpg"# 打开图像 image Image.open(image_path)# 将图像转换为numpy数组 image_ar…

Redis持久化策略揭秘:如何实现高可用!

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】 大家好!我是你们的小米,很高兴和大家分享Redis的持久化知识。Redis作为一款强大的内存数据库,经常被用于缓存和存储临时数据。然而,在很多场景中,我们希望Redis的数据能够持久保存,以备不时之需。那么,Redis如…

SpringBoot 操作 Redis

导入对应版本的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>修改配置文件中的信息 spring:redis:host: 127.0.0.1port: 8888注意: 我这里 xsh…

SVD奇异值分解原理及应用

-------------------------------------------------------------------------------------------------------------------------------- 首先说明&#xff1a;本文的内容来自百家号“人工智能遇见磐创”大佬的整理&#xff0c;感谢原作者&#xff08;本文在原作者的基础上按…

影响钕铁硼磁钢性能的因素及方法

钕铁硼永磁材料自问世以来&#xff0c;就以其优越的磁性能而备受关注&#xff0c;被称为“磁王“&#xff0c;在市场需求的不断地增长下&#xff0c;钕铁硼生产工艺及磁体性能也不断发展和提升。我们一般用剩磁、矫顽力和最大磁能积这几个指标来衡量磁性材料的磁性能。 剩磁 B…

三. TensorRT基础入门-TensorRT简介

目录 前言0. 简述1. 什么是TensorRT2. TensorRT的工作流介绍3. TensorRT的一些限制总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第三章—TensorRT 基础入门&#xf…

2024年3月电风扇家电线上电商(京东天猫淘宝)销售数据排行榜

鲸参谋监测的线上电商&#xff08;京东天猫淘宝&#xff09;平台3月份的电风扇家电销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年3月份&#xff0c;电风扇市场呈现出稳步增长态势。在线上电商平台上电风扇总销量累计约226万件&#xff0c;环比上个月上涨了2…

前程贷v6.5系统测试报告

1.引言部分 1&#xff0e;1 项目背景 本测试报告的具体编写目的&#xff0c;指出预期的读者范围。(3-4句) 项目描述 &#xff08;项目内容&#xff0c;用户需求&#xff09; 本测试报告为**&#xff08;系统名称&#xff09;**系统测试报告&#xff1b;本报告目的在于总结测试…

可平滑替代FTP的传输方案,需要具备哪些特质?

随着技术的发展和网络安全需求的提升&#xff0c;传统的FTP受安全性和效率方面的局限性&#xff0c;已经逐渐不能满足现代企业的需求。因此&#xff0c;许多企业和组织开始寻找替代FTP的方案&#xff0c;以提高文件传输的安全性、效率和便捷性。FTP传输存在的弊端及不足主要包括…

洛谷 A+B 问题 python

题目描述 输入两个整数 a,b&#xff0c;输出它们的和 输入格式 两个以空格分开的整数&#xff08;不是输入两个input&#xff08;&#xff09;解决&#xff09;。 输出格式 一个整数。 输入输出样例 输入 20 30 输出 50 这个问题的难点就是在于python当中进行两个输入数字…

JavaScript-3.DOM

通过HTML DOM,可以访问JavaScript HTML文档中的所有元素 DOM(Document Object Model) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。将网页内的元素封装成一个对象,并建立元素的层级关系,形似一棵树,称为DOM树。 通过可编程的对象模型,…

【简单介绍下Faiss原理和使用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【软考---系统架构设计师】软件架构

目录 1 一、软件架构的概念 二、软件架构风格 &#xff08;1&#xff09;数据流风格​​​​​​​ &#xff08;2&#xff09;调用/返回风格 &#xff08;3&#xff09;独立构件风格 &#xff08;4&#xff09;虚拟机风格 &#xff08;5&#xff09;仓库风格 三、架构…

知识图谱的起源与发展

文章目录 知识图谱的发展历史知识图谱的重要性知识图谱与Ontology、语义网络之间的区别知识图谱的定义 知识图谱的发展历史 知识图谱始于20世纪50年代&#xff0c;至今大致分为三个发展阶段&#xff1a;第一阶段 &#xff08;1955年—1977年&#xff09;是知识图谱的起源阶段&a…

C++学习————第八天(C/C++内存管理)

目录 1、1.C/C内存分布 2、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3、C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4.operator new与operator delete函数 5. new和delete的实现原理 5.1 内置类型 5.2 自定…

C++ 初识模板

目录 0.前言 1.泛型编程 2.函数模板 2.1概念 2.2格式 2.3原理 2.4函数模板的实例化 2.4.1隐式实例化 2.4.2显式实例化 2.5模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 4.结语 &#xff08;图像由AI生成&#xff09; 0.前言 在 C 中&a…

密码学 | 承诺:常见的承诺方案

&#x1f951;原文&#xff1a;密码学原语如何应用&#xff1f;解析密码学承诺的妙用 - 知乎 1 简介 密码学承诺 涉及 承诺方、验证方 两个参与方&#xff0c;以及以下两个阶段&#xff1a; 承诺阶段&#xff1a;承诺方选择一个敏感数据 v v v&#xff0c;为它计算出相应…

docker打包部署自己的应用

docker部署应用 当谈及使用 Docker 进行容器化部署应用时&#xff0c;可以想象它是一个能够将整个应用程序及其所有依赖项打包成一个独立、可移植的容器的工具。这个容器不仅包含了应用代码&#xff0c;还包括了操作系统、运行时环境以及所有依赖的库和组件。这样一来&#xf…