09-06-2025

how to get the variable length string in C?

here is one of the solution


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#include <stdlib.h>

char *get_string(){
int length = 0, capacity = 0;
int ch;
char *str = NULL;

while((ch = getchar()) != '\n' && ch != EOF){
if(length+1 > capacity){
capacity = (capacity == 0) ? 16 : capacity * 2;
char *temp = realloc(str, capacity);
if(temp == NULL){
free(str);
return NULL;
}
str = temp;
}
str[length++] = (char) ch;
}
if(str != NULL){
str[length] = '\0';
}
else{
str = calloc(1,sizeof(char));
if(str == NULL) return NULL;
}
return str;
}

07-22-2025

埃氏筛


高效筛选出某个范围内所有质数 的经典算法

思路:假设我们想找出 2 ~ N 之间的所有质数:

  1. 先假设 2~N 都是质数。

  2. 从 2 开始,把它的所有倍数(2×2, 2×3, 2×4…)都标记为合数。

  3. 再找到下一个未被标记的数(一定是质数),然后把它的所有倍数标记为合数。

  4. 不断重复,直到处理到 √N 为止。

  5. 剩下所有未被标记的数就是质数。


C代码

1
2
3
4
5
6
7
8
9
10
11
// 初始化
for (int i = 2; i <= n; i++) isPrime[i] = true;

// 埃氏筛
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}

从小到大,遇到质数就划掉他的倍数


we gt introduce the vise of eula

compared with vise of esteranis, this vise would’t get any re-count if its not prime, let start


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
C form

#include <stdbool.h>
#include <stdlib.h>

void vise_of_eula(int num){
if(num < 2){
obviously, no prime
}
bool *is_composite = (bool*) calloc(num+1, sizeof(bool));
int *Primes = (int*) malloc((num+1) * sizeof(int)),cnt = 0;
for(int i = 2; i <= num; i++){
if(!is_composite){
Primes[cnt++] = i;
}
for(int j = 0; j < cn && i * Primes[j] <= num; j++){
is_composite[i * Primse[j]] = true;
if(i % Primse[j] == 0) break;
}

}
free(is_composite);
int *final_Prime = realloc(Primes, cnt*sizeof(int));
free(Primes);
}

07/15/2025

一道小学入门题,从余数相同问题引出函数递归,并延伸到质因数分解


题目描述

已知三个正整数 $a$,$b$,$c$。现有一个大于 $1$ 的整数 $x$,将其作为除数分别除 $a$,$b$,$c$,得到的余数相同。

请问满足上述条件的 $x$ 的最小值是多少?数据保证 $x$ 有解。

输入格式

一行,三个不大于 $1000000$ 的正整数 $a$,$b$,$c$,两个整数之间用一个空格隔开。

输出格式

一个整数,即满足条件的 $x$ 的最小值。

输入输出样例

输入
1
300 262 205
输出
1
19

一道入门问题,只为了完成该任务直接选择无脑循环即可,但是从题目给出的数学角度出发,可以引入辗转相除法:

1
int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}

三元运算符节省空间,函数调用步进提供最大公约数,三个多个都一样,套娃就ok。但是他题目要求的是大于1的最小的公约数,这里就牵扯到了质因数分解,因为所有公约数都蕴含在最大公约数里,考虑设计方法求出所有质因数:设计循环,从2开始,每一个数都除干净,

1
2
循环上限为 <= sqrt(n) 的所有质数,因为如果a <= b, a * b = n; 那么 a * a <= a * b = n;
同时b也可以做质因数分解,因此只需要考虑上限内的质数,如果都不满足,那么该数就是质数。

用上述方法我们就将公倍数质因数分解成功,并从中找到了最小的非1公倍数!

Embedded_Software

此文档主要记录本人在软件学习方面遇到的问题及技术总结

文章结构根据学习路线进行逐级更新,在学习与工作中存在问题也会同步更新,学习路线如下:

1.


1.建立计算机系统基础【 1-2个月 】

《深入理解计算机系统》 && 《C Primer Plus》
刷题

  • 洛谷:入门难度500题

2.数据结构与算法 【 2-4个月 】

《数据结构、算法与应用》 && 《C++ Primer》
可选补充《算法导论》
刷题

第一阶段

  • LeetCode:Easy难度
    • 数组:两数之和(1)、移除元素(27)
    • 链表:反转链表(206)、合并两个有序链表(21)
    • 字符串:验证回文串(125)、字符串转整数(8)
  • Codeforces:Div.4或Div.3的A/B题
    • 侧重输入输出和简单逻辑。

第二阶段

刷题建议

  • LeetCode:Easy-Medium难度
    • 树:二叉遍历(94/144/145)、对称二叉树(101)
    • 图:岛屿数量(200)、课程表(207)
    • 排序:合并区间(56)、前K个高频元素(347)
  • Codeforces:Div.3的C/D题
    • 练习贪心、简单动态规划(如背包问题)。

3.操作系统与Linux内核

《Linux内核完全剖析》 && 《Linux内核完全注释》
配合阅读:《计算机网络》
刷题建议

  • LeetCode:Medium-Hard难度
    • 动态规划:零钱兑换(322)、编辑
      距离(72)
    • 系统设计:LRU缓存(146)、实现
      Trie(208)
  • Codeforces:Div.2的D/E题
    • 练习高级数据结构(线段树、并查
      集)和数学思维。

4.高级应用与优化

《C++Primer》进阶 && 《算法导论》

  • Codeforces:Div.1/比赛全站
    • 参与周赛/虚拟比赛,训练速度和思
      维。
  • LeetCode:高频面试题
    • 重点:二叉树、链表、动态规䎞(如
      股票问题系列)。

Think_deeply&Play_with_time

深度思考,与时间赛跑

有关数学的内容

线性分解————LU分解与QR分解

  将矩阵分成两个或更多矩阵的乘积,起到简化计算的作用
LU分解:A为mxn阶矩阵,可以写成形式为A=LU,其中L是mxm下三角矩阵,可逆;主对角线元素全为1,U是mxn的阶梯型矩阵,此时方程Ax=b变化为LUx=b,可拆分为Ly=b与Ux=y。此时由于拆分方程1和2都是三角矩阵,方程易解。
求解方法:仅使用行倍加变化,将A变换为U,即A=LU,同时可以证明,单位下三角矩阵的乘积和逆也是下三角矩阵,若不可能,L的元素满足用相同的一系列行变化把L变为I。
直观感受算法优势:计算nxn的稠密矩阵A直接计算A.^(-1)需要2n.^3次浮算,A.^(-1)与b乘需要2n.^2次浮算;LU分解大致需要(2n^3)/3次浮算,解Ly=b与Ux=y大约需要n.^2次浮算。同时应注意,实际中矩阵A可能稀疏,然而A.^(-1)很可能是稠密的,此时用LU分解可能会快得多。

Embedded-Hardware-PCBlayout

此文档主要记录本人在PCB硬件设计上的所有经验技术总结

1.PCB硬件Layout都包括哪些内容?


2.常用布线技巧(无顺序,想到哪写哪)

2.1 关于扇出

  扇出是为解决Layout中针对多引脚封装的布线繁杂问题。两层板设计一般一面横线,一面竖线,起码保证两扇出过孔间有能加入一条
横线
,以MCU为例,参考扇出如下图所示

2.常用Layout技巧(无顺序,想到哪写哪)

2.1 关于扇出

  扇出是为解决Layout中针对多引脚封装的布线繁杂问题。两层板设计一般一面横线,一面竖线,起码保证两扇出过孔间有能加入一条横线,以MCU为例,参考扇出如下图所示,广义上的扇孔其实是针对一个模块把内部连接完成,把外部需要的线全部打孔占位。

9e8ffe6 (更新)

2.2 关于拉线

  拉线为保证连线更加美观,将元件的所有引脚聚成一股拉出,减小漏连概率且提高观赏性,参考拉线如下图所示

2.3 尖角铜及处理方法

  尖角铜指铺铜时由于结构原因,区域限制导致铺铜出现宽高比非常小的部分,该部分在实际电路运行时往往会导致电信号回流,对板结
构产生较大影响!,实际设计中需要予以避免消除。
解决思路:能打地孔则打孔,无法打孔则设置禁止区域重新铺铜。

2.4 定位孔

=======
  尖角铜指铺铜时由于结构原因,区域限制导致铺铜出现宽高比非常小的部分,该部分在实际电路运行时往往会导致电信号回流,对板结构产生较大影响!,实际设计中需要予以避免消除。
解决思路:能打地孔则打孔,无法打孔则设置禁止区域重新铺铜。

2.4 定位孔

9e8ffe6 (更新)
  定位孔一般在附近增加1mm来设置禁止区域,防止由于定位元件(螺钉)导致的短接。

2.5 常用禁止铺铜走线元件

  继电器、晶振(干扰严重)

  继电器

  小封装电阻电容内部禁止穿线

  电感:电感器件下方尽量避免走线,同时所在层需要挖空铜皮处理,如果电感附近有走线,需要对信号线包地处理。

  晶振:为时钟提供基准信号,决定电路的稳定性,布线时严禁在晶振中横穿其他信号线,同时尽量避免在晶振下方或附近布置高速信号线或电源线。同时应使用差分走线方式,并在晶振周围进行包地线处理(法拉第笼增强抗干扰),并且在晶振背面进行完整地平面铺设。

蓝牙模块:蓝牙模块在 PCB 设计时,在 PCB 布局布线空间充足的情况下建议设计模块内区域保持禁空,不进行信号布线且不进行布局其它器件在模块区域内部。

2.6 关于过孔

如果空间足够,尽量避免过孔直接打到焊盘上(美观加上可能会有焊料损失,焊接不牢固)

过孔,仅仅只是在顶层连接,且内层底层之间没有进行任何连接,即为天线过孔,天线过孔同样是会形成天线效应,会接受其他的信号干扰源。

2.7 关于线路加宽处理

电机电路驱动线要进行加宽处理,保证电机驱动功能正常。

喇叭功放,正负极线需要进行加宽处理,确保音频电路功能正常。

3.电源模块设计

一般常用PCB常用电源模块有LDO,开关电源和PMU电源,因此主要针对这三种模块进行设计规范。

3.1 LDO模块设计规范

  1. 以LDO核心元器件布局。

  2. 滤波电容按照先大后小原则,尽量靠近芯片引脚摆放。

  3. 电源输入输出端尽量远离,避免噪声耦合。

  4. 主干道处理,以铺铜代替布线。

3.2 开关电源模块设计规范

  1. 如果有Datasheet,以其推荐原理图设计布局,注意回流路径越短越好。

  2. 与LDO滤波电容摆放需求相同

  3. 使相邻电感垂直放置,大电感和大电容尽量布置在主器件面。

  4. 尽量保持单点接地,于主器件下方回流至地,避免开关噪声沿地平面传播。

  5. 开关电源模块内部信号互联线尽量短而粗,原理干扰源。

  6. 中间散热焊盘建议双面开窗

3.3 PMU模块设计规范

  1. 以PMU为中心,先考虑DC-DC(参考3.2),再考虑LDO布局(参考3.1)。

  2. BUCK部分需要输入输出电容就近可靠接地,接地点靠近,做到回路尽可能短。

  3. PMU的I2C走线尽量避免同层或者隔层的干扰

3.4 电源完整性分析

  1. 元件面、焊接面为完整的地平面。

  2. 关键信号与地层相邻,不跨分割,如不可避免,要适当加跨接电容
    形成信号回流通道。

  3. 优先电源平面和地平面紧耦合。

  4. 关键电源有一对应地平面相邻。

  5. 对于PCB上小范围内用到的电源如某个IC芯片的核心工作电压,尽
    量在信号层上灌铜解决。

  6. 平面的分割宽度20~30mil。对于模拟电源和数字电源的分割宽度需
    适当加大,以防止数字电源对模拟电源的噪声干扰;压差大的电源
    也需要增加。

  7. 电源平面分割要尽量保持规则,不允许有细长条及哑铃形分割;注意电
    源瓶颈的出现。

  8. 相邻层不同的电源平面要避免交叠放置,以防止噪声的互扰。

  9. 模拟电源和模拟地;数字电源和数字地,在平面层分割时要严格分开,
    不要在平面上存在容性耦合。

  10. 电源的分割区域要正确,模拟电源区域上要避免有数字信号和数字器件,
    数字电源区域上要避免有模拟信号和模拟器件,以防止噪声的互扰。

  11. 电源层要比地层内缩1mm,并在内缩区域每隔150mil打屏蔽地过孔。

3.5 通用电源布局思路

输入端电源建议大面积两面同时铺铜处理


4.USB接口设计规范

4.1USB布局要点

  1. 接口靠近板边放置,方便拔插;

  2. ESD器件靠近接口放置,走线需先经过ESD器件(ESD器件是防浪涌 与稳压管不同 原理图看着很像 注意区分)

  3. 在元件布局时,使差分线路最短,以缩短差分线走线距离。

  4. EMI滤波器或共模电感需靠近USB插座放置,防止电磁辐射;

  5. USB2.0接口需注意2.2ohm电阻, USB3.0接口TX N/P需要注意AC耦合电容布局,都需要靠近接口摆放;

  6. 阻抗要求控制:USB差分阻抗Zdiff为90Ω(常规差分阻抗一般为100Ohm、差分地过孔回流);

  7. USB差分需要进行打孔包地,差分换层处需要打屏蔽地过孔。

  8. 差分需要进行对内等长,误差为±5mil;

  9. 如若在设计中有使用保护地,保护地的线宽>=100mil保护地和信号地之间的间距>=40mil;

  10. USB3.0以上所有信号都需要进行对间等长(对间指不同的差分信号间);

  11. USB3.0 SSTX N/P,RX N/P,换孔尽量不要超过2个,信号完整的参考平面,信号不能进行跨分割(跨分割:从另一个层面相对不同的完整参考平面跨过去了 会导致信号没办法做信号阻抗
    事实上无法做所有信号线跨分割 所以只需要针对所有的等长信号不要跨分割即可);


5.存储器模块PCB设计

5.1 SDRAM布局布线要点

  1. 位置要求
    靠近CPU或BGA放置
    2片时,相对于CPU严格对称
    空间足够时,与CPU放在同一面,空间不足时SDRAM顶底对贴
    SDRAM到CPU推荐的中心距离:
    中间无排阻时,900-1000mil
    中间有排阻时,1000-1300mil
  2. 端源匹配电阻应靠近输出管脚放置
  3. 拓扑结构: SDRAM的数据、地址线推荐采用菊花链布线和远端分支方式布线
  4. 始终处理: 对于时钟信号采用RCR滤波,包地或至少保证3W间距
  5. 电源处理: 首先也好保证SDRAM器件所有管脚靠近放置退耦电容
  6. 阻抗控制: 所有信号线控制50ohm
  7. 网络分组: 1.数据线每9根要求同组同层
    2.地址线、时钟线、控制线分一组
    3.所有电源和地分一组
  8. 所有信号线的间距满足3W原则
  9. 空间允许下,应该在数据线,地址线,时钟线之间加地线进行隔离,并放置地过孔
  10. 分组等长,误差100mil以内。

5.2 FLASH模块设计

  1. 靠近主控摆放
  2. 管脚滤波就近放置
  3. 串接电阻靠近主控摆放,串阻和主控布线长度≤300mil
  4. Flash和SDRAM公用信号时,布局采用菊花链
  5. 时钟包地处理

my_first_blog

这是我的自我介绍及目标的博客!

从今天(2025.5.17)开始,我会在个人博客上更新有关自己的技术栈堆叠历程以及部分人生路上的成长心得体会。

个人简单介绍:
    动物界->脊索动物们->哺乳纲->杂食目->人科->人属->智人
    希望能通过自己的努力,在人生短暂的几十年中
    不断追寻自己想要的东西。通过站在巨人肩膀上眺望得到的见识做出大众真正需要的电子产品。
    时间轴:2002.5.24 来到这个世界
               2020-2024 哈尔滨工业大学 精密仪器 本科
               2025- 清华大学 仪器仪表工程 硕士
    个人爱好:技术,运动,美食,乐器,FPS游戏狂热爱好者 

2025年目标:

现在来看,终于没有了升学的烦恼,可以把自己的身心完全投入进技术之中了。
[]1.使用c与c++,把codeforces的和洛谷的题全部刷一遍。
[]2.看完《匠人手记》 并尝试做出一个让自己满意的机器人。
[]3.六级考六百分以上(只能等下半年了,但是听力要早点练)。
[]4.今年到明年3月,积攒相关技术栈,明年暑假实习一定要去其中一家,(大疆、OPPO、影石、德州仪器):按照相机工程师的标准,
对嵌入式软硬件的学习需全面发展,循序渐进。
[]5.通关深圳IO
[]6.看完《工程控制论》 《自动控制原理》并以此来加深matlab的使用(看了很多家企业,对于控制的学习还是需要进一步加深的)。
[]7.通过《机械设计》来加深对solidworks的使用。
[x]8.有一定的资产积累
[]9.坚持运动
[x]10.成为清华大学的研究生
[]11.健康生活(此处应该主要指的是早睡早起和健康饮食)
[]12.学会吉他所有的弦
[]13.加深对PCBLayout的印象
[]14.阅读至少十本专业书籍。
[x]15.趁着自己还有时间,出去旅游。
[完成]8.有一定的资产积累
[]9.坚持运动
[完成]10.成为清华大学的研究生
[]11.健康生活(此处应该主要指的是早睡早起和健康饮食
[]12.学会吉他所有的弦
[done]13.加深对PCBLayout的印象
[]14.阅读至少十五本专业书籍。
[完成]15.趁着自己还有时间,出去旅游。