当前位置: 首页 > 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.dtcms.com/a/304607.html

    相关文章:

  • GO 开发环境安装及配置
  • Claude Code 使用教程(对接智谱模型)
  • 84、【OS】【Nuttx】【启动】栈溢出保护:asm 关键字(下)
  • SpringBoot集成Quzrtz实现定时任务
  • 【目标检测】小样本度量学习
  • 记录一个TI DSP编译器的Bug
  • CentOS安装ffmpeg并转码视频为mp4
  • 预过滤环境光贴图制作教程:第四阶段 - Lambert 无权重预过滤(Stage 3)
  • 预过滤环境光贴图制作教程:第一步 - HDR 转立方体贴图
  • Android Compose 自定义组件完全指南
  • 对College数据进行多模型预测(R语言)
  • 《React与Vue构建TODO应用的深层逻辑》
  • 【lucene】SegmentCoreReaders
  • linux_前台,后台进程
  • LeetCode热题100——155. 最小栈
  • (LeetCode 面试经典 150 题) 150. 逆波兰表达式求值 (栈)
  • 电脑主机显示的python版本是3.8.6,但是我在控制面板没有找到,想删除不知道怎么操作怎么办
  • 《 java 随想录》| LeetCode链表高频考题
  • 【LeetCode】大厂面试算法真题回忆(111)--身高排序
  • 鱼皮项目简易版 RPC 框架开发(五)
  • 2.oracle保姆级安装教程
  • 逐渐走进Ai世界~
  • Django模型开发:模型字段、元数据与继承全方位讲解
  • Unity_SRP Batcher
  • 【WRF-Chem 实例1】namelist.input 详解- 模拟CO2
  • 基于AI代码疫苗技术的开源软件供应链安全治理
  • C# _列表(List<T>)_ 字典(Dictionary<TKey, TValue>)
  • 【dropdown组件填坑指南】—怎么实现下拉框的位置计算
  • 【机器学习深度学习】为什么需要分布式训练?
  • 从硬编码到自主智能体:营销AI的20年技术演进与未来展望