系列文章目录

速通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语言支线第一站 基础刷题相关推荐

  1. Python基础刷题录-1

    Python基础刷题录 2020-08-27 1.实现输出1 - 2 + 3 - 4 + 5 - 6 ... + 99的和 2.改变语句的大小写,使其符合英语书写规范 3.利用下划线将列表的每一个元素 ...

  2. 字节青训营Go语言学习第一天--基础语言+实战案例

    文章目录 走进Go语言基础语言 2.2基础语言-变量 2.3基础语法- if else 2.4基础语法-循环 基础语法-switch 基础语法-数组 基础语法-切片 基础语法-map 基础语法-ran ...

  3. python基础刷题_数据结构与算法LeetCode刷题(Python)

    参考资料: 一.链表 1.  链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2.  链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...

  4. 速通C语言第一站 一篇博客带你初识C语言

    感谢佬们支持! 文章目录 前言 一.C语言的前世今生&&如何写C语言 二.初识C语言 1.  第一个C语言程序(万恶之源) 2.  数据类型 计算机中的单位 介绍各种类型 各数据类型的 ...

  5. 12篇学通C#网络编程——第一篇 基础之进程线程

    在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念 首先我们要知道什么是"进程",什么是"线程",好,查一下 ...

  6. 秣小白的C语言旅程——第一站

    鄙人C语言小白一枚,步履蹒跚地踏上了C语言学习的旅途,旅途景色新奇却也难免有曲折坑洼.小记旅途的艰难险阻,愿帮更多小白顺畅踏上旅途. 一.四舍五入 鄙人在做C语言练习题时,常常会在数据的"四 ...

  7. C语言—PTA乙级·基础刷题—1001卡拉兹猜想

    ** 第一题:卡拉兹猜想 ** 题目基础内容:while循环.分支语句."/"与"%"符号. 题解: 首先明确求解问题:给一个小于1000的数n,需要多少次才能 ...

  8. python内置函数用来返回列表、元组、字典_python程序设计第一章基础知识 题库及选解...

    由于学校的python是笔试,所以找了份感觉比较好的题库刷了下其中前八章的填空和判断,附上选解.各章链接如下 填空 1. Python安装扩展库常用的是()工具.(pip) 2. Python标准库m ...

  9. 吃一堑长一智!java基础刷题网站

    前言 今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学,内存管理好像离我们很远,但这个知识点虽然冷门(估计很多人学完根本就没机会用上)但绝对是基础中的基础,这就像武侠中的内功修炼 ...

最新文章

  1. Netty深入浅出(一)入门
  2. 如何制作一个通用的多系统安装U盘七(Windows相关配置)
  3. 反向非归零编码_【基础】什么是编码器?
  4. PHP开发调试环境配置(基于wampserver+Eclipse for PHP Developers )
  5. Spring Boot与消息
  6. php文件域的作用,PHP作用域和文件夹操作示例
  7. quot c语言数组压缩 quot,程序员之---C语言细节12(指针和数组细节,quot;//quot;的可移植性说明)...
  8. Angular依赖注入机制的一个错误消息:Error Cannot instantiate cyclic dependency!
  9. 走进webpack(1)--环境拆分及模块化
  10. K8s 学习者绝对不能错过的最全知识图谱(内含 56个知识点链接)
  11. yum 安装oraclejdk_kubernetes-16:制作oraclejdk镜像
  12. canvas中文显示乱码 html5_40个常见的HTML5 面试问题及答案
  13. SQL Server 2008 R2:error 26 开启远程连接详解
  14. 【BZOJ 1050】1050: [HAOI2006]旅行comf (动态SPFA)
  15. python实现四阶龙格库塔法
  16. Tech Talk| Redmi K50 电竞版手机极致散热技术详解
  17. VUE启动报错:Error: The project seems to require yarn but it‘s not installed
  18. PHP使用文字检索,关键词查询,分词查询
  19. 视频号怎么赚钱?视频号有什么功能?
  20. 【VUE】实现分页组件

热门文章

  1. 淘宝中的UV,PV,IPV
  2. C++之enum与switch
  3. uoj 246. 【UER #7】套路
  4. Capstone CS5210|CS5210 HDMI to VGA转换器
  5. iOS 模拟器安装 .app 方法
  6. PPT怎么用100张照片做照片墙?
  7. Kali忘记root密码强制更改办法
  8. 使用Go语言完成文件夹的MD5计算
  9. 与CVTE的完美“邂逅”
  10. html 刷新表格数据,当我刷新页面时在html表格上重复数据