当前位置: 首页 > 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.xdnf.cn/news/1211239.html

    相关文章:

  • SQL158 每类视频近一个月的转发量/率
  • C++:stack与queue的使用
  • Leetcode-3152 特殊数组 II
  • 进阶向:Manus AI与多语言手写识别
  • 【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(5)——Tool Calling(工具调用)
  • scrapy框架新浪新闻
  • 【大语言模型入门】—— Transformer 如何工作:Transformer 架构的详细探索
  • 用LangGraph实现聊天机器人记忆功能的深度解析
  • k8s搭建nfs共享存储
  • AI应用:电路板设计
  • Linux 线程概念与控制
  • Excel文件批量加密工具
  • Intellij Idea--解决Cannot download “https://start.spring.io‘: Connect timedout
  • 爬虫自动化:一文掌握 PyAutoGUI 的详细使用
  • Kruskal算法
  • 智能Agent场景实战指南 Day 23 : Agent安全与隐私保护
  • 百度前端面试题目整理
  • VUE进阶案例
  • 【C#学习Day13笔记】静态成员、接口、运算符重载和索引器
  • 小杰数据结构(one day)——心若安,便是晴天;心若乱,便是阴天。
  • python基础:request请求Cookie保持登录状态
  • p5.js 从零开始创建 3D 模型,createModel入门指南
  • MongoDB系列教程-教程概述
  • SQL 怎么学?
  • STM32--DHT11(标准库)驱动开发
  • spring cloud sentinel 动态规则配置
  • 【华为机试】20. 有效的括号
  • docker docker、swarm 全流程执行
  • C++多态:面向对象编程的灵魂之
  • 网络安全第15集