高精度计算
有点意思🫠 题目描述用高精度计算出 S=1!+2!+3!+⋯+n!(对于 100% 的数据,1≤n≤50)。 其中 ! 表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。 输入格式一个正整数 n。 输出格式一个正整数 S,表示计算结果。 题目来源:洛谷 阶乘求和 我的解题思路首先看到这个题我直接狂喜,这就不是一道”简简单单”的题目吗?(对于还没学习算法的人来说)。所以最开始我的思路就是直接用循环计算阶乘不就好了吗? 123456789101112131415161718192021222324252627#include <iostream>using namespace std;void method2(){ long long n, ans = 0; cin >> n; long long factor = 1; for (int i = 1; i <= n; ++i) // 循环n次 { factor *= i; // fo...
回文质数
自己的思路分析,以防自己忘记 题目描述因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。 写一个程序来找出范围 [a, b](5 ≤ a < b ≤ 100,000,000)间的所有回文质数。 输入格式第一行输入两个正整数 a 和 b。 输出格式输出一个回文质数的列表,一行一个。 题目来源于洛谷 回文质数 Prime Palindromes 我的解题思路通过以上的题目信息我们可以得到一个基本的思路1.判断某个数是否是质数2.判断某个数是否是回文数3.这个数是否同时满足以上两个条件 函数设计判断是否为质数在设计函数之前,我们要明确质数的概念。质数:指大于1的自然数中,除了1和它本身以外不再有其他因数的数。我们可以有以下的设计思路: 我们可以通过遍历[2,n),再将遍历的某个数与n相除,若没有余数说明他们能够整除,即不满足质数的条件 于是我们便有以下的代码 123456789101112bool is_prime(int num){ for (int i = 2; i < num; ++i...
串口通信
你会看到,unsigned char的一万种用法(bushi)、串口通信的原理和操作方法、try-catch有什么用?虽然是AI生成的(),但是我们可以借助它来学习 unsigned char 解释unsigned char 是C/C++中的一种基本数据类型,表示无符号字符型数据。以下是详细解释: 基本特性 无符号性:只能表示非负整数,范围是0到255(在大多数平台上) 大小:通常占用1字节(8位)内存空间 用途: 存储原始字节数据 处理小范围的非负整数 实现位操作和字节级操作 与char和signed char的区别 char:可能是signed或unsigned,取决于编译器实现 signed char:明确表示有符号字符,范围-128到127 unsigned char:明确表示无符号字符,范围0到255 示例代码123456unsigned char byte = 200; // 有效unsigned char max_val = 255; // 最大值// unsigned char negative = -1; // 错误,不能赋负值// 常用于...
数据结构和算法(5)
二叉树、图 二叉树定义:每个节点最多有两个子节点的树结构,称为左子节点和右子节点。 类比:1、像家族的家谱图,每个人(节点)最多有两个孩子(左孩子和右孩子)。2、像游戏中的技能树,每个技能可能有两个分支。 例如: 50 / \ 30 70 / \ / \ 20 40 60 80 核心术语: 根节点(Root):树的顶层节点(没有父节点)。 叶子节点(Leaf):没有子节点的节点。 深度(Depth):根节点到当前节点的边数。 高度(Height):当前节点到最远叶子节点的边数。 子树(Subtree):以某个节点为根的子树 规则: 每个节点的子节点数量可为0、1、2。 如果有两个子节点,则其中一个子节点的值必须小于父节点的值,另一个子节点的值必须大于父节点。 查找 查找原理利用BST的性质:左子树所有节点值 < 根节点值右子树所有节点值 > 根节点值 查找流程(迭代实现)步骤: 从根节点开始。 若当前节点值等于target_value,返回该节点。 若...
数据结构和算法(4)
链表、双向队列 链表链表像数组一样,也用来表示一系列的元素。但是链表的实现和数组不同,在不同的场景他们会有不同的性能表现。我们知道,数组在计算机内存中是连续的(如果不懂的话请自行AI),而链表是可以分布在内存的各个地方,这种不连续的内存空间,我们称之为结点(很重要,后面都会涉及到这个概念)。 关键:每个结点除了保存着数据,他还保存着链表里下一结点的内存地址。而这份用来指示下一结点的内存地址的额外数据,被称为链。 读取、插入与删除读取链表不同于数组,数组在任何情况下的查找效率为O(1)。而链表是由一个个结点组成的,因此在查找某个数据的时候需要一个一个遍历结点,因此在最坏的情况下,链表的查找效率为O(N),比数组的效率低得多。 插入在某些情况下,链表的插入跟数组相比有着明显的优势。数组中想在0索引处插入数据,则需要将所有数据右移一格。而链表中像这样做,只需要新建一个结点再链接到下一结点即可。而链表若是想在末尾插入数据,却比数组慢得多:链表需要遍历到最后一个结点再新建结点并链接;而数组只需要直接在末尾插入就好。因此我们会发现,链表和数组的最坏情况和最好情况刚好是反着来的。 ...
数据结构和算法(3)
递归、快速排序 递归函数调用自身,就称为递归。递归看起来很简单,其实一点也不一般。它可以代替循环,例如我们要计算某个数的阶乘 123456int jiecheng(int num){ if(num == 1) return 1; else return num * jiecheng(num-1); } 怎么看懂递归?就拿上述代码举例,一步一步分析。 假如我们想计算4的阶乘jiecheng(4) 首先判断传进来的数字是否为1,这里显然不是,而这个条件又很重要,它决定着不再进行递归,这个情形被称为基准情形 接着将这个数和jiecheng(3)相乘 然后jiecheng(3)再重复上述步骤 直到数字为1,停止递归,返回jiecheng(4)的值 通过以上的流程,我们可以总结一下:1、在一个递归当中,一定会有基准情形,它决定着递归什么时候该结束2、通过基准情形,我们只需要知道调用一次时函数在干什么,便可知道整个递归在干什么 计算机中的递归 计算机会用栈来记录每个调用中的函数,这个栈叫做调用栈 计算机最开始会调用jiecheng(4)...
数据结构和算法(2)
散列表、栈、队列 数据结构和算法(2)散列表 散列表(Hash Table,又称哈希表)是一种高效的数据结构(可以简单的理解为一种高效的数组),用于实现键值对(Key-Value)的存储和快速查找。 查找的平均效率为O(1) 原理 举个简单的例子A = 1B = 2C = 3D = 4 通过将字符串转化为数字串的过程就是散列,用于对照的密码叫做散列函数。既然是函数,一定是通过某种法则。例如BAD会转化为214,通过数字求和的函数我们可以得到哈希值2 + 1 + 4 = 7,通过求积的函数我们可以得到哈希值2 x 1 x 4 = 8。但是散列函数必须满足调用同一字符串时,返回的哈希值相同的条件,否则就会出问题。 定义:将任意大小的键(如字符串、对象等)转换为固定大小的整数值(哈希值) 处理冲突有时候我们会遇到一些问题。在前面散列表的一个键BAD返回的哈希值(乘法散列函数)为8,现在我们想加入DAB,我们会发现返回的哈希值仍然是8,这会造成冲突。 解决散列冲突的方法有两种:开放寻址法(open addressing)和链表法(chaining) 开放寻址法:如果出现了...
数据结构和算法(1)
算法、大O记法 数据结构和算法(1)什么是算法?算法,即解决某个问题的一套流程。例如最简单的一个问题,如何把大象装进冰箱?第一步,打开冰箱;第二步,将大象装进冰箱;第三步,关上冰箱。而这整个的流程,就叫算法。但是每个人都有不同的方法,比如小明在装大象时,把大象切成块,多了一个步骤,现在小明需要四步才能把大象装进去,而之前的方法只需要三步,这就叫做时间复杂度。随着要装的大象越来越多,小明所用的步骤越来越多,即n*3步,在这里我们使用大O记法来描述步骤,即O(3n)。但是在大O记法中,我们忽略常数。所以,小明装大象的时间复杂度为O(n)。在程序设计中,我们会想方设法的优化我们的算法,以此来让程序运行相应得更快,发挥代码的极限性能。因此,学习算法是很有必要的。 大O记法的规则:1、忽略常数2、只关注最高阶的N 排序算法和其效率现在我们要对数组 int arr[5] = {4, 2, 7, 1 ,3}进行排序 冒泡排序123456789101112131415161718192021void BubbleSort(){ for (int i = 0; i < 5 ...
多线程编程
多线程编程(基于C++)目录 什么是多线程 创建线程 线程管理 线程的传参 线程的同步与互斥 什么是多线程首先我们需要了解什么是线程。 线程(Thread)是操作系统能够进行调度的最小单位,它比进程更小,是进程的一个子集。线程是程序执行的最小单位,用于实现并发执行。 多线程指的是一个程序中包含两个或者两个以上的线程,多线程的提出是为提高代码的执行效率,这就好比工厂中的流水线,只有一条称为单线程,有多条流水线就称为多线程。 我这里还有更形象一点的例子。AI生成 线程比喻:餐厅里的服务员 想象你走进一家餐厅,餐厅就像一个程序,而餐厅里的服务员就像线程。 餐厅(进程) 餐厅是整个程序的运行环境,它有自己的资源,比如厨房(内存)、餐具(文件句柄)、服务员(线程)等。 餐厅的资源是有限的,但它可以同时为多个顾客服务。 服务员(线程) 服务员是餐厅里的线程,他们负责完成各种任务,比如点菜、送餐、清理桌子等。 每个服务员可以独立完成任务,但他们共享餐厅的资源(比如厨房和餐具)。 顾客(任务) 餐厅里的顾客代表程序中的任务。每个顾客有不同的需求,比如点不同的菜或者要...
如何学习开源代码?
关于如何学习开源代码?对此我简单的以为学习开源代码就是把代码看懂,但是一旦面对工程量庞大的代码,一下子就没有任何的头绪了,而且并没有任何学长教我们,查AI似乎也不太有效果,我就去请教了下老师。经过一下午的学习,我对开源代码学习又有了一个新的认识。 如何开始?我们用这份开源项目来做个例子(也是我正在看的)对于一份正经的开源项目,一定会有一份完善的README文件。例如,通过这份README文档,我们可以获得以下信息 硬件配置 环境部署 调节参数 环境配置 文件结构通过这些信息,我们可以大概了解整个程序所需要的配置以及它能实现的功能。如果遇到什么陌生的东西(对于我来说例如线程延时、Eigen、Cere…),这个时候我们就要自去通过各种手段去查阅相关资料去了解,这比无脑的去看还是强太多了。 Next首先,我们需要明白什么叫做程序。程序,就是数据结构+算法+逻辑。我认为,如果我们想看懂某个项目的代码,首先就需要明确整个项目的逻辑,也就是整个代码的主程序入口(bash)。只有梳理好整个代码的逻辑,我们才能做到代码在心中杂而不乱。接下来我们来看看代码的文件结构 文件结构123456789...

