速通C语言支线第一站 基础刷题
系列文章目录
速通C语言支线第一站 基础刷题
文章目录
- 系列文章目录
- 前言
- 一、进制类
- 1 打印8、16进制
- 2 16进制转10进制
- 3 进制转换类
- 推论:一个数二进制位有几个1
- 变式:判断n是否是2的k次方
- 4 获取一个整数二进制序列中的所有奇数、偶数位、并打印二进制序列
- 总结
感谢佬们阅读支持!
前言
作为一个程序员,我们不仅要学好主线的知识,刷题也是很重要的。所以,我另开了一个刷题专栏作为我们学习的支线,给大家带来几道我认为还有价值的题目。
一、进制类
进制作为我们学习计算机的基本功,有很多题目也是以此为背景展开的。
1 打印8、16进制
在C语言中,打印八进制要用 %o; 打印十六进制要用%X
#include<stdio.h>
int main()
{printf("%o %X", 1234, 1234);return 0;
}
(成功打印)
另外,如果题目要求我们显示出八进制、十六进制的后缀,我们可以有如下操作
printf("%#o %#X ", 1234, 1234);//或者
printf("0%o 0x%X", 1234, 1234);
两种操作均可成功显示
2 16进制转10进制
域宽实际上就是用于存放输出数据的宽度。如果域宽大于被打印数据的宽度,数据通常会在域内右对齐。如果输出值的宽度大于域宽时,域宽是自动增长的。
域宽的出现是为了让输出对齐,使输出更美观
我们直接上程序
#include<stdio.h>
int main()
{printf("%15d\n", 0xABCDEF);return 0;
}
3 进制转换类
一个整数的某进制位如何得到?
我们不妨先来思考一个数的10进制的每一位如何得到
例:得到123的每一位
//得到3
123 % 10 = 3;
//得到2
123 / 10 = 12;
12 % 10 = 2;
//得到1
12 / 10 = 1;
1 % 10 = 1;
//当我们拿到0,就结束了
1 / 10 = 0;
但是这波我们得到的顺序是反的, 要想得到正确的顺序,我们需将其存入数组中。
代码如下
int main()
{int i = 0;int arr[20] = { 0 };int n = 0;//输入要转换的数scanf("%d", &n);//1 得到每一位,并存入数组中//n到0就结束了while (n){arr[i++] = n % 10;n /= 10;}//2 从数组最后一个元素开始打印,从而得到正确的顺序for (--i; i >= 0; i--){printf("%d ", arr[i]);}return 0;
}
(无注释版)
int main()
{int i = 0;int arr[20] = { 0 };int n = 0;scanf("%d", &n);while (n){arr[i++] = n % 10;n /= 10;}for (--i; i >= 0; i--){printf("%d ", arr[i]);}return 0;
}
上题中,我们得到每一位的核心逻辑是 “%10 /10”。同理可得,我们想更换n进制然后获得每一位,也可以直接 “%n /n”。
我们以获取123 6进制的每一位为例
只需将上题中的%10 /10改为 %6 /6 即可
int main()
{int i = 0;int arr[20] = { 0 };int n = 0;scanf("%d", &n);while (n){arr[i++] = n % 6;n /= 6;}for (--i; i >= 0; i--){printf("%d ", arr[i]);}return 0;
}
推论:一个数二进制位有几个1
int Set(int n)
{//计数器int count = 0;while (n){if (n % 2 == 1){count++;n /= 2;}}return count;
}
int main()
{int n = 0;scanf("%d", &n);int set = Set(n);printf("%d\n", set);return 0;}
我们输入3,由于3是011,所以有两个1。
但是,这段代码它有个缺陷,就是不能对负数进行操作。我们对它改造一波
传参的时候先将参数强转为(unsigned int ), 由于可能是负数,所以我们不再采用 %2 /2的操作。
我们实用位操作符中的按位与&来操作。
由于 1&1=1;0&1=0;所以我们可以创建一个循环来迭代一个数的每一位。
话不多说,我们直接上代码。
int Set(int n)
{int i = 0;int count = 0;//由于一个数的二进制位有32位,所以循环32次for (i = 0; i < 32; i++){//用>>右移二进制位if ((n >> i) & 1 == 1){count++;}return count;}
}
可行,但是我们有一种更牛逼的方法:n&(n-1)
下面,我先通过画图向大家演示一下
由于每执行一次就少个1,所以执行几次这个数的二进制位就有几个1.
代码实际上非常简单,重点还是了解这个方法的思想。
int Set(int n)
{int count = 0;while (n){n = n & (n - 1);count++;}return count;
}
变式 判断n是否为2的k次方
众所周知
2的二进制为: 00000000 00000000 00000000 00000001
4的二进制为: 00000000 00000000 00000000 00000010
8的二进制为: 00000000 00000000 00000000 00000100
……
所以,当我们用n&(n-1)操作后,就会去掉唯一的1。
即n&(n-1)必等于0
int main()
{int n = 0;scanf("%d", &n);if (n & (n - 1) == 0){printf("这个数是2的k次方");}return 0;
}
4 获取一个整数二进制序列中的所有奇数、偶数位、并打印二进制序列
对于获得一个数二进制位的某某位,我们可以用上个题我们学过的移动>> 和按位与&来操作。
void print(int n)
{int i = 0;//奇数位for (i = 30; i >= 0; i -= 2){printf("%d ", (n >> i) & 1);}printf("\n");//偶数位for (i = 31; i >= 1; i -= 2){printf("%d ", (n >> i) & 1);}
}
在主函数中,我们输入2进行验证
(非常奈斯)
总结
做总结,今天浅略的带大家刷了几道有关进制的题,有很多牛逼的思路是我们需要通过做题来积累的,大家想不到也不要愧疚,我们都是站在巨人的肩膀上学习,大家只要学会了思路并学会如何实现,长此以往也能成为一个大佬的。
水平有限,还请各位大佬指正。如果觉得对你有帮助的话,还请三连关注一波。希望大家都能拿到心仪的offer哦。
每日gitee侠:今天你交gitee了嘛
速通C语言支线第一站 基础刷题相关推荐
- Python基础刷题录-1
Python基础刷题录 2020-08-27 1.实现输出1 - 2 + 3 - 4 + 5 - 6 ... + 99的和 2.改变语句的大小写,使其符合英语书写规范 3.利用下划线将列表的每一个元素 ...
- 字节青训营Go语言学习第一天--基础语言+实战案例
文章目录 走进Go语言基础语言 2.2基础语言-变量 2.3基础语法- if else 2.4基础语法-循环 基础语法-switch 基础语法-数组 基础语法-切片 基础语法-map 基础语法-ran ...
- python基础刷题_数据结构与算法LeetCode刷题(Python)
参考资料: 一.链表 1. 链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2. 链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...
- 速通C语言第一站 一篇博客带你初识C语言
感谢佬们支持! 文章目录 前言 一.C语言的前世今生&&如何写C语言 二.初识C语言 1. 第一个C语言程序(万恶之源) 2. 数据类型 计算机中的单位 介绍各种类型 各数据类型的 ...
- 12篇学通C#网络编程——第一篇 基础之进程线程
在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念 首先我们要知道什么是"进程",什么是"线程",好,查一下 ...
- 秣小白的C语言旅程——第一站
鄙人C语言小白一枚,步履蹒跚地踏上了C语言学习的旅途,旅途景色新奇却也难免有曲折坑洼.小记旅途的艰难险阻,愿帮更多小白顺畅踏上旅途. 一.四舍五入 鄙人在做C语言练习题时,常常会在数据的"四 ...
- C语言—PTA乙级·基础刷题—1001卡拉兹猜想
** 第一题:卡拉兹猜想 ** 题目基础内容:while循环.分支语句."/"与"%"符号. 题解: 首先明确求解问题:给一个小于1000的数n,需要多少次才能 ...
- python内置函数用来返回列表、元组、字典_python程序设计第一章基础知识 题库及选解...
由于学校的python是笔试,所以找了份感觉比较好的题库刷了下其中前八章的填空和判断,附上选解.各章链接如下 填空 1. Python安装扩展库常用的是()工具.(pip) 2. Python标准库m ...
- 吃一堑长一智!java基础刷题网站
前言 今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学,内存管理好像离我们很远,但这个知识点虽然冷门(估计很多人学完根本就没机会用上)但绝对是基础中的基础,这就像武侠中的内功修炼 ...
最新文章
- Netty深入浅出(一)入门
- 如何制作一个通用的多系统安装U盘七(Windows相关配置)
- 反向非归零编码_【基础】什么是编码器?
- PHP开发调试环境配置(基于wampserver+Eclipse for PHP Developers )
- Spring Boot与消息
- php文件域的作用,PHP作用域和文件夹操作示例
- quot c语言数组压缩 quot,程序员之---C语言细节12(指针和数组细节,quot;//quot;的可移植性说明)...
- Angular依赖注入机制的一个错误消息:Error Cannot instantiate cyclic dependency!
- 走进webpack(1)--环境拆分及模块化
- K8s 学习者绝对不能错过的最全知识图谱(内含 56个知识点链接)
- yum 安装oraclejdk_kubernetes-16:制作oraclejdk镜像
- canvas中文显示乱码 html5_40个常见的HTML5 面试问题及答案
- SQL Server 2008 R2:error 26 开启远程连接详解
- 【BZOJ 1050】1050: [HAOI2006]旅行comf (动态SPFA)
- python实现四阶龙格库塔法
- Tech Talk| Redmi K50 电竞版手机极致散热技术详解
- VUE启动报错:Error: The project seems to require yarn but it‘s not installed
- PHP使用文字检索,关键词查询,分词查询
- 视频号怎么赚钱?视频号有什么功能?
- 【VUE】实现分页组件