当前位置: 首页 > news >正文

【牛客网C语言刷题合集】(五)——主要二进制、操作符部分

🌟菜鸟主页:@晨非辰的主页

  👀学习专栏:《C语言刷题集》

💪学习阶段:C语言方向初学者

名言欣赏:"每个程序员都曾是一个对着‘段错误’痛哭的新手。"


前言:本篇的第2、3题为二进制、操作符问题,但是操作符涉及较少

往期习题回顾:

1.【牛客网C语言刷题合集】(四)——分支循环语句与数组综合运用(包括知识补充)


目录

1. 空心正方形图案

2. 二进制中1的个数

3.  统计两个整数二进制位不同个数


1. 空心正方形图案

题目链接:空心正方形图案_牛客网

 


解题思路——

--对于准备工作,小子就不多bb了; 直接看结构

  • 大体结构

--首先,看到示例演示:多行输出,想到与数组输入也是分行列,知道又出现嵌套循环

--假设输入数值num,则外层循环主要负责行的变换,从1行到num行,内部结构运行完就直接换行进行下一次循环;

--内层循环主要负责每行的输入,针对每行输出形式的异同,发现分为两种:

        --第1行与num行发现全输出'*'加空格;

        --中间部分为:第1列和num列为'*',其余空格;

--每行进行打印输出时要注意,因为题目规定 ' * ' 之间存在空格,即输出一个 ' * ' 占两个字符,所以当单纯输出空格要两个,确保形式对齐。


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int num = 0;printf("请输入3~20的整数:");while (scanf("%d", &num) != EOF){//循环行数,共num行for (int i = 1; i <= num; i++){//在每行中进行输出for (int j = 1; j <= num; j++){//根据示例,判断是否为第一行和num行,全部输出'*';//其他情况只第1列和num列输出'*'if ((i == 1) || (i == num) || (j == 1) || (j == num)){printf("* ");}//其余位置空格else{printf("  ");//两个空格是因为统一列宽,因为上面*输出占两个字符}}//输出完换行printf("\n");}}return 0;
}

2. 二进制中1的个数

题目链接:统计二进制中1的个数_牛客网OJ


解题思路——

--首先提醒各位盆友,这道题牛客网只要求写出自定义函数部分,不上传主函数部分;为了更好的记录学习过程,小子就全部写了……

  • 大体结构

--首先主函数部分:必要定义变量小子不再说明,只需将函数返回值打印出;

--定义函数部分:(此前已经学习了操作符部分,有了相关知识基础)

        --比如输入15,那么可知15主要的补码二进制序列为:1111,预测结果输出为4

        --针对二进制序列,我们可以从最低位入手判断最低位是否为1,再将整个向右移动1位

        --根据上面的思路,我们会用到所学的移位操作符(<<、>>)以及位操作符(&、|、^、~);  

&按位与:对应位均为 1 时结果为 1,否则为 0。

| 按位或:对应位至少有一个 1 时结果为 1,否则为 0。

^按位异或:对应位不同时结果为 1,相同时为 0。

~按位取反:所有位取反(包括符号位)。

        --根据移位操作符各自特性:选择将目标数值序列 & 0001,即1111 & 0001,结果序列0001最低位=1 ;判断完成后,将目标序列右移一位,使用 >> 移位操作符即1111——>0111;

        --这样循环重复上一部分内容即可。


//定义统计函数
int  count_bits1_of_n(int n)
{int count = 0;//循环进行判断for (int i = 0; i < 32; i++){//如果符合,右移一位再&1if (((n >> i) & 1) == 1){count++;//n = n >> 1;}}return count;
}
int main()
{int num = 0;printf("请输入:");scanf("%d", &num);//定义函数求补码中的1int ret = count_bits1_of_n(num);printf("num1的个数:%d", ret);return 0;
}

 

3.  统计两个整数二进制位不同个数

题目链接:统计两个整数二进制位不同个数_牛客网OJ


 解题思路——

  • 大体结构

--主要问题在于如何比较二者的二进制序列,在次我们倒是可以沿用上一题的部分思路:

        --先只取二进制序列的最低位进行比较,但是注意并不是直接按照将二者的序列进行比较;

        --将每个序列都 & 1 后得到的最低位进行比较,不同则计数+1,在将每个序列向右移动1位(>>);


int main()
{int num1 = 0;int num2 = 0;printf("请输入两个整数:");scanf("%d%d", &num1, &num2);int i = 0;int count = 0;//定义变量计数//对于主要实现部分,可以沿用上一题的思路for (i = 0; i < 32; i++){if (((num1 >> i) & 1) != ((num2 >> i) & 1)){count++;}}printf("不同位个数:%d\n", count);return 0;
}

结语:本篇内容收录在《C语言刷题集》中,本篇主要分享的是有关二进制、操作符的练习,难度不大,只是思路比较难想到,一定程度上能够有效提升编程能力和问题思考能力,喜欢的朋友们,三连后一起来学习吧!!! 

    http://www.lryc.cn/news/604010.html

    相关文章:

  • 深入解析mediasoup:构建实时音视频通信的高性能SFU解决方案
  • 用LangGraph实现聊天机器人记忆功能的深度解析
  • 深度学习篇---PaddleDetection模型选择
  • 循环神经网络——动手学深度学习7
  • electron-vite 动态加载脚本 实现动态插件
  • 使用jQuery时的注意事项
  • 爬虫逆向之瑞数五案例:某某医学院(补环境,联调)
  • 直播间里的酒旅新故事:内容正在重构消费链路
  • logtrick 按位或最大的最小子数组长度
  • 计算器4.0:新增页签功能梳理页面,通过IO流实现在用户本地存储数据
  • Java注解全面解析与应用实战
  • 三维扫描相机:工业自动化的智慧之眼——迁移科技赋能智能制造新纪元
  • 前端优化之虚拟列表实现指南:从库集成到手动开发
  • MongoDB系列教程-第一章:MongoDB简介、安装 、概念解析、用户管理、连接、实际应用示例
  • Java抽Oracle数据时编码问题
  • Spring Boot with RabbitMQ:四大核心模式指南
  • TDengine 中 TDgpt 异常检测的数据密度算法
  • TDengine 中 TDgpt 异常检测的机器学习算法
  • 中科米堆CASAIM金属件自动3d测量外观尺寸三维检测解决方案
  • 【数据结构初阶】--二叉树(四)
  • C# _列表(List<T>)_ 字典(Dictionary<TKey, TValue>)
  • uniapp 实现全局变量
  • C++与C#实战:FFmpeg屏幕录制开发指南
  • 高级机器学习
  • RTSP协议详解与C++实现实例
  • Witsbb健敏思携手奥运冠军吴敏霞 共启科学分龄育儿新时代
  • ubuntu22.04 安装 petalinux 2021.1
  • Makefile 快速入门指南
  • 用FunASR轻松实现音频转SRT字幕:完整脚本与解析
  • Jenkins 节点连接故障定位及解决方案总结 - PKIX path validation failed