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

发布于:2025-07-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

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

  👀学习专栏:《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++)
	{
        //如果符合,右移一位再&1
		if (((n >> i) & 1) == 1)
		{
			count++;
			//n = n >> 1;
		}
	}
	return count;
}
int main()
{
	int num = 0;
	printf("请输入:");
	scanf("%d", &num);

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


    网站公告

    今日签到

    点亮在社区的每一天
    去签到