【牛客网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语言刷题集》中,本篇主要分享的是有关二进制、操作符的练习,难度不大,只是思路比较难想到,一定程度上能够有效提升编程能力和问题思考能力,喜欢的朋友们,三连后一起来学习吧!!!