c刷题(三)

程序运行结果 

int a, b, c;
a = 5;
c = ++a;
b = ++c, c++, ++a, a++;
b += a++ + c;
printf("a = %d b = %d c = %d\n", a, b, c);

line3:c=6,a=6;

line4:(逗号表达式,从左向右计算,结果为最后一个表达式)c=8,a=8,b=6(后置)

line5:a=8,c=8,+=优先级最低,先计算 a++ +c = 16,然后a自增1,b = 17 + 6 = 23。

计算二进制中1的个数

前面讲操作符的时候讲了一种计算二进制1的个数的方式,用移位操作符和位操作符进行判断,还有两种方式也可以计算二进制中1的个数。

除余法

整数除以2的本质是将操作数的二进制向右移动一位,等价于>>操作符,而%2则可以判断二进制的最后一位是否为1,因为奇数最低的二进制位必为1.(2^0)

int count_bit(unsigned int m)
{int count = 0;while (m){if (m % 2 == 1)count++;m /= 2;}return count;
}

需要注意,计算负数需要传无符号整形,否则会导致计算不准确。 

n&(n-1)法

每进行一次n&n-1的操作都会消去一个1:
n:     10010

n-1: 10001

n&n-1: 10000

n-1:   01111

n&n-1: 00000

可以发现,我们只用了两次就得到了1的个数,通过观察,n-1会将最左边的1变成0,在进行&操作时就会将它变为0,是性能最高的方法。

int count_bit(int m)
{int count = 0;while (m){ m = m & (m - 1);count++;}return count;
}

 求两个数二进制不同的个数

移位法

移位法没什么好说的,用& , | 或^都可以比较具体二进制位是否相同。

int count_diff_bit(int m, int n)
{int i = 0;int count = 0;for (i = 0; i < 32; i++){if ((m >> i) & 1 != (n >> i) & 1)count++;}return count;
}

异或法

相异为1,再通过刚才我们提到的n&(n-1)法可以直接计算出1的个数就是不同的个数。

int count_diff_bit(int m, int n)
{int count = 0;int ret = m ^ n;while (ret){ret = ret & (ret - 1);count++;}return count;
}

相同怎么办?32减去1的个数就行了呗! 

程序运行结果

int i;
int main()
{i--;if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0;
}

这里有个隐藏知识点就是全局变量或静态变量未初始化时默认为0局部变量一般初始化为随机值

显然-1是不可能大于一个正数的,但sizeof是无符号类型,用于计算内存大小,在进行比较时算数优先级低的int类型会被转换成unsigned int进行比较,此时-1被当作一个很大的正数来看待,所以会输出'>’。 

上三角判定

上三角矩阵判定_牛客题霸_牛客网

先打印矩阵,下三角要遍历所有行,选择遍历列,以对角线为结束条件(j<i),设置一个开关默认为1,当遇到0时利用goto语句跳出多层循环的特点打印"NO",否则打印1。

	int n;scanf("%d", &n);int arr[n][n];int i = 0;for (i = 0; i < n; i++){int j = 0;for (j = 0; j < n; j++){scanf("%d", &arr[i][j]);}}int flag = 1;for (i = 0; i < n; i++){int j = 0;for (j = 0; j < i; j++){if (arr[i][j] != 0){flag = 0;goto end;}}}
end:if (flag == 0)printf("NO\n");else printf("YES\n");

注意没有执行goto end这一语句时仍然会执行end:后的语句。

进制转换

小乐乐与进制转换_牛客题霸_牛客网

  • 我们都知道10进制转换为6进制要先进行取余操作:

6%6 = 0

  • 再进行除法:

6/6 = 1        

1做为新的操作数重复以上操作就能得到6进制的形式,可以看出结果是逆序的,我们可以考虑用递归的形式。

 常规做法

#include <stdio.h>
int main()
{int n = 0;int arr[40] = {0};int i = 0;scanf("%d", &n);while(n){arr[i++] = n%6;n/=6;}for(i--; i>=0; i--){printf("%d", arr[i]);}return 0;
}

利用数组接收每一个倒序的6进制数,再逆序打印就是对应的结果。

递归

void six_swap(int n)
{if(n>0){six_swap(n/6);printf("%d",n%6);}
}
int main()
{int a;scanf("%d", &a);six_swap(a);
}

删除指定数字

序列中删除指定数字_牛客题霸_牛客网

思路:遍历数组,将不为删除的数字放入原数组,跳过需要删除的数组。

当然,也可以直接跳过删除的数字打印,算是一种取巧的做法。

#include <stdio.h>int main()
{int num;scanf("%d", &num);int arr[50] = { 0 };//数组大小0<m<50int i = 0;for (i = 0; i < num; i++){scanf("%d", &arr[i]);}int del;scanf("%d", &del);//创建一个新的变量接收不需删除的元素int j = 0;for (i = 0; i < num; i++){if (arr[i] != del){arr[j] = arr[i];j++;}}for (i = 0; i < j;i++){printf("%d ", arr[i]);//打印新的数组}/*for (i = 0; i < num; i++){if(arr[i]!=del)printf("%d",arr[i]);}选择性忽略做法*/return 0;
}

小乐乐走台阶

小乐乐走台阶_牛客题霸_牛客网

两种走法,第一次走一步还有n-1步,第一次走2步还有n-2步,第二次可以选择走一步(n-2 || n-3)或者两步(n-3 || n-4).......

 

以3为例, 每一层有两种选择,每条支路相加就是所有的走法了。

#include <stdio.h>
int Fab_sta(int x)
{if (x <= 2)return x;else{return Fab_sta(x-1) + Fab_sta(x-2);}
}
int main()
{int a;scanf("%d",&a);printf("%d",Fab_sta(a));return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DP读书:鲲鹏处理器 架构与编程(十一)鲲鹏生态软硬件构成

鲲鹏生态软硬件构成 鲲鹏软件构成硬件特定软件1. Boot Loader2. SBSA 与 SBBR3. UEFI4. ACPI 鲲鹏软件构成 鲲鹏处理器的软件生态是一个不断发展的软件生态&#xff0c;服务器本身也具有复杂度多样性&#xff0c;经过很长时间的发展服务器硬件有不同的操作系统方案&#xff0c…

如何向BertModel增加字符

这里写自定义目录标题 看起来add_special_tokens和add_tokens加入的新token都不会被切分。

基于ssm+vue德云社票务系统源码和论文

基于ssmvue德云社票务系统源码和论文063 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1.选题的依据和意义 互联网时代&#xff0c;随着生活节奏的加快和不断上升的压力&#xff0c;人们急需寻找到情绪的宣泄…

redis缓存雪崩、穿透、击穿解决方案

redis缓存雪崩、穿透、击穿解决方案 背景缓存雪崩缓存击穿缓存穿透总结背景 关于缓存异常,我们常见的有三个问题:缓存雪崩、缓存击穿、缓存穿透。这三个问题一旦发生,会导致大量请求直接落到数据库层面。如果请求的并发量很大,会影响数据库的运行,严重的会导致数据库宕机…

Spring Cloud Nacos 和 Eureka区别,包含实战代码

目录 一、Spring Cloud Eureka详解二、Spring Cloud Nacos详解三、Spring Cloud Nacos和Eureka区别 Spring Cloud Nacos 和 Spring Cloud Eureka 都是 Spring Cloud 微服务框架中的服务注册和发现组件&#xff0c;用于帮助开发者轻松地构建和管理微服务应用。它们之间的主要区别…

Python工具箱系列(四十一)

使用zip批量压缩文件 前文的代码示例了使用gzip对单个文件进行压缩。本文示例使用更通用的zipfile来批量压缩文件。zipfile也是python内置的库&#xff0c;使用起来非常方便。废话不说&#xff0c;直接上代码示例。 import dbm import glob import zipfile# 保存压缩计划的库名…

电子价签如何让电信门店数字化事半功倍?

数字化转型&#xff0c;高效的工具首先跟上。早在2020年&#xff0c;深圳电信就与云里物里开展商业合作&#xff0c;在深圳所有电信营业厅安装云里物里的ESL电子标签&#xff0c;以替代传统纸质标签的显示。经过几年的效果认证&#xff0c;云里物里的数字化智显设备得到了深圳电…

网页接口导入postman进行接口请求

postman版本&#xff1a;v10.17.4 一、拷贝接口信息 网页打开开发者工具-networkk&#xff0c;在网页上请求一次接口&#xff0c;鼠标指在接口上&#xff0c;点击鼠标右键-copy-copy as cURL(bash) 二、导入postman 打开postman&#xff0c;点击import-Raw text&#xff0c;…

【MCU】SD NAND芯片之国产新选择

文章目录 前言传统SD卡和可贴片SD卡传统SD卡可贴片SD卡 实际使用总结 前言 随着目前时代的快速发展&#xff0c;即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问&#xff1a; 大家好&#xff0c;请问有没有SD卡芯片&#xff0c;可以直接焊接到P…

[MyBatis系列⑥]注解开发

&#x1f343;作者简介&#xff1a;准大三本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐MyBatis系列①&#xff1a;增删改查 ⭐MyBatis系列②&#xff1a;两种Dao开发方式 ⭐MyBatis系列③&#xff1a;动态SQL ⭐MyBatis系列④&#xff1a;核心…

java 桥接模式

桥接模式 桥接模式简介桥接模式的实现总结 桥接模式简介 桥接模式&#xff08;Bridge&#xff09;是将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。它是一种对象结构型模式&#xff0c;又称为柄体(Handle and Body)模式或接口(Interfce)模式。 桥接模式基于…

C语言 - 结构体、结构体数组、结构体指针和结构体嵌套

结构体的意义 问题&#xff1a;学籍管理需要每个学生的下列数据&#xff1a;学号、姓名、性别、年龄、分数&#xff0c;请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构&#xff1a; 学号&#xff08;num&#xff09;&#xff1a; int 型姓名&#xff08;…