[{"content":"王菲声音怎么这么美这么仙啊，一晚上给我整的要飞升了 ","date":"2026-11-07T00:12:00+08:00","permalink":"/001HTML-Web/posts/nb/","title":"王菲NB"},{"content":"题目 质数筛\n输入 n 个不大于 10⁵ 的正整数。要求全部储存在数组中，去除掉不是质数的数字，依次输出剩余的质数。\n输入格式\n第一行输入一个正整数 n，表示整数个数。\n第二行输入 n 个正整数 aᵢ，以空格隔开。\n输出格式\n输出一行，依次输出 aᵢ 中剩余的质数，以空格隔开。\n代码 #include \u0026lt;iostream\u0026gt; using namespace std; int main() { int n; cin \u0026gt;\u0026gt; n; int a[100]; int m; int o = 0; // 记录质数的个数 for (int i = 0; i \u0026lt; n; i++) { cin \u0026gt;\u0026gt; m; // 依次读入这 n 个数字 int s = 0; // 【优化】判断质数只需要从 2 遍历到 sqrt(m) 即可，效率提升极大 for (int t = 2; t * t \u0026lt;= m; t++) { if (m % t == 0) { s++; } } // 【修复】加上 m \u0026gt; 1，排除数字 1 的干扰 if (s == 0 \u0026amp;\u0026amp; m \u0026gt; 1) { a[o] = m; o++; } } for (int i = 0; i \u0026lt; o; i++) { cout \u0026lt;\u0026lt; a[i] \u0026lt;\u0026lt; \u0026#34; \u0026#34;; } return 0; } 两个关键点 只试到 √m：若 m 有因数 t，那么 m/t 也是因数，且两者必有一个 ≤ √m。所以 t * t \u0026lt;= m 就够，不用 t \u0026lt; m。写成 t * t 而不是 t \u0026lt;= sqrt(m)，还能避免浮点误差和额外的 \u0026lt;cmath\u0026gt; 依赖。 1 不是质数：m \u0026gt; 1 这个条件不能省，否则输入 1 会被当成质数输出。 另外 a[100] 是按「最多 100 个数」开的，如果 n 可能更大，数组要跟着放大（或用 std::vector）。\n","date":"2026-10-29T19:50:00+08:00","permalink":"/001HTML-Web/posts/code-prime-sieve/","title":"质数筛（好题 1）"},{"content":"一维数组的创建和初始化 创建一维数组，需要规定数据类型、数组名、数组大小：\ntype arr_name[常量]; int a[1001]; 初始化：\nint a1[5] = {1, 2, 3, 4, 5}; // 完全初始化 int a2[5] = {1, 2, 3}; // 不完全初始化，剩余位置由 0 填充 int a3[5] = {0}; // 首个元素初始化为 0，剩下的默认为 0 由字符构建数组：\nchar ch[] = {\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;}; char ch2[] = \u0026#34;CNWU\u0026#34;; printf(\u0026#34;%c\u0026#34;, ch[1]); // 输出数组里面想要的某一位字符 printf(\u0026#34;%s\u0026#34;, ch2); // 输出字符串 注意：\n字符串尾部隐藏了结束符 \\0，所以数组里每个字符串会有（看到的字符数 + 1）个位置。也就是说，如果给每个字符串设置了 20 个字符位置，那么最多只能输入 19 个字符。 %s 打印字符串时，直到 \\0 才结束。 求字符串长度：strlen 与 sizeof strlen 求字符串长度时会一直数，直到遇到 \\0 结束。 所以形如 char ch2[] = \u0026quot;CNWU\u0026quot; 的字符串可以得出正确的值，而 char ch[] = {'a', 'b', 'c'} 会越界访问，出现乱码。\nsizeof 得出的值单位为字节，它是操作符而非函数，算的是操作数所占内存大小，什么类型都适用； strlen 是库函数，需要包含头文件 string.h，只针对字符串，统计的是 \\0 之前字符的个数。\nint arr[10] = {0}; printf(\u0026#34;%zu\\n\u0026#34;, sizeof(arr)); // 10*4=40，数组的总大小，单位字节 printf(\u0026#34;%zu\\n\u0026#34;, sizeof(arr[0])); // 4，第一个元素的大小，单位字节 printf(\u0026#34;%zu\\n\u0026#34;, sizeof(arr) / sizeof(arr[0])); // 10，元素个数 输出：40 / 4 / 10。\n二维数组 二维数组的创建与一维相同：\nint a[][5]; 左边为行，右边为列，列不可省略。\n初始化：\nint arr1[3][5] = {1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7}; int arr2[3][5] = {{1, 2}, {3, 4}, {5, 6}}; 下一篇：函数的设计\n","date":"2026-10-29T19:49:00+08:00","permalink":"/001HTML-Web/posts/c-array/","title":"数组（一维与二维）"},{"content":"ASCII 码表（0–127） 大写字母在前，码值更小：A–Z = 65–90，之后是 a–z = 97–122，小写整体比大写大 32。 两者之间（91–96）夹着 6 个符号：[、\\、]、^、_、`（反引号）。\n1. 完整码表 行列都是十六进制：码值 = 行 × 16 + 列。\n高位 \\ 低位 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x0 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI 0x1 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 0x2 空格 ! \u0026quot; # $ % \u0026amp; ' ( ) * + , - . / 0x3 0 1 2 3 4 5 6 7 8 9 : ; \u0026lt; = \u0026gt; ? 0x4 @ A B C D E F G H I J K L M N O 0x5 P Q R S T U V W X Y Z [ \\ ] ^ _ 0x6 ` a b c d e f g h i j k l m n o 0x7 p q r s t u v w x y z { | } ~ DEL 举例：A 在 0x4 行第 1 列 → 4×16+1 = 65；a 在 0x6 行第 1 列 → 6×16+1 = 97。\n2. 大小写字母对照 大写 码值 小写 码值 大写 码值 小写 码值 A 65 a 97 N 78 n 110 B 66 b 98 O 79 o 111 C 67 c 99 P 80 p 112 D 68 d 100 Q 81 q 113 E 69 e 101 R 82 r 114 F 70 f 102 S 83 s 115 G 71 g 103 T 84 t 116 H 72 h 104 U 85 u 117 I 73 i 105 V 86 v 118 J 74 j 106 W 87 w 119 K 75 k 107 X 88 x 120 L 76 l 108 Y 89 y 121 M 77 m 109 Z 90 z 122 每一对差值恒为 32：a - A = 32，b - B = 32 …… z - Z = 32。\n3. 常用速查 字符 码值 字符 码值 '0' 48 '9' 57 'A' 65 'Z' 90 'a' 97 'z' 122 空格 32 'a' - 'A' 32 补充：数字 0–9 的码值是连续的 48–57，所以 '7' - '0' 直接得到数值 7。\n4. C/C++ 里的用法 char c = \u0026#39;m\u0026#39;; // 判断小写（下界小、上界大，别写反） if (c \u0026gt;= \u0026#39;a\u0026#39; \u0026amp;\u0026amp; c \u0026lt;= \u0026#39;z\u0026#39;) { /* ... */ } // 判断大写 if (c \u0026gt;= \u0026#39;A\u0026#39; \u0026amp;\u0026amp; c \u0026lt;= \u0026#39;Z\u0026#39;) { /* ... */ } // 小写 -\u0026gt; 大写 if (c \u0026gt;= \u0026#39;a\u0026#39; \u0026amp;\u0026amp; c \u0026lt;= \u0026#39;z\u0026#39;) c -= 32; // 大写 -\u0026gt; 小写 if (c \u0026gt;= \u0026#39;A\u0026#39; \u0026amp;\u0026amp; c \u0026lt;= \u0026#39;Z\u0026#39;) c += 32; // 字符数字转真正的数字 int d = \u0026#39;7\u0026#39; - \u0026#39;0\u0026#39;; // d == 7 也可以用 \u0026lt;cctype\u0026gt; 里的现成函数：\n#include \u0026lt;cctype\u0026gt; islower(c); isupper(c); isdigit(c); toupper(c); tolower(c); 5. 两个常见错误 错误一：区间写反\nif (c \u0026gt;= \u0026#39;z\u0026#39; \u0026amp;\u0026amp; c \u0026lt;= \u0026#39;a\u0026#39;) // 恒假 等价于 c \u0026gt;= 122 \u0026amp;\u0026amp; c \u0026lt;= 97，要求一个数同时大于 122 又小于 97，永远不成立。 正确写法是 c \u0026gt;= 'a' \u0026amp;\u0026amp; c \u0026lt;= 'z'，等价于 97 \u0026lt;= c \u0026lt;= 122。\n错误二：把 sizeof 当成字符串长度\nfor (int p = 1; p \u0026lt; sizeof(m); p++) // 错，sizeof(string) 恒为 32 for (int p = 1; p \u0026lt; m.size(); p++) // 对 sizeof 是编译期运算符，算的是类型占多少字节，与内容无关；std::string 的长度要用 m.size()。\n相关笔记：数组（一维与二维）\n","date":"2026-10-29T19:46:00+08:00","permalink":"/001HTML-Web/posts/ascii-table/","title":"ASCII 码表（0–127）"},{"content":"目标\n掌握自定义函数的设计（参数、返回值……） 掌握用函数进行代码编写 掌握函数的声明和定义，还有多文件程序的基本形式 掌握 static 和 extern 关键字的使用 1. 函数概念 函数实际上是一个小程序，里面包装了预先写好的代码，用于减少重复代码的书写，比如 main、scanf、printf。\n2. 函数的形式 数据类型 + 函数名 +（参数），(void) 表示没有参数。\nint name(int x, int y) // 函数头 { return x + y; // 函数体 } 3. 库函数 预先写好、包装好的函数，被集中放在库文件中，配有说明书「头文件」。 一般由编译器厂商放在自家编译器中。 4. 自定义函数 一串自己写的代码：\n#include \u0026lt;stdio.h\u0026gt; // 定义函数 int average(int x, int y) { int z = (x + y) / 2; return z; } int main() { int a, b; scanf(\u0026#34;%d %d\u0026#34;, \u0026amp;a, \u0026amp;b); int r = average(a, b); printf(\u0026#34;%d\u0026#34;, r); return 0; } 下一篇：三目运算符，可以用来简化判断最大值的函数。\n参数：形参和实参 形参，即定义函数时的参数（int x, y），它们在未被调用、没有存储实参时，不会申请占用内存，并不是真实存在的。 实参，即传递给函数的参数（如 a、b），它们是实际存在的。 ","date":"2026-10-29T19:45:00+08:00","permalink":"/001HTML-Web/posts/c-function/","title":"函数的设计"},{"content":"三目运算符（条件运算符） C++ 唯一的三目运算符，用来在一个表达式里完成 if-else 的选择。\n原型\n条件 ? 条件成立时的值 : 条件不成立时的值 ↑ ↑ ↑ 判断 true 分支 false 分支 先判断，再二选一：条件为真取 ? 后面那个，为假取 : 后面那个。\n典型用法：求最大值 int myMax(int x, int y) { return x \u0026gt; y ? x : y; } 等价于：\nint myMax(int x, int y) { if (x \u0026gt; y) return x; else return y; } 比 if-else 强在哪 表达式能直接嵌进别的地方，if-else 不行：\nint big = x \u0026gt; y ? x : y; // 直接赋值 cout \u0026lt;\u0026lt; (x \u0026gt; y ? x : y); // 直接输出 a[x \u0026gt; y ? 1 : 0]++; // 直接当下标 三个坑 坑 错误写法 正确写法 优先级低，嵌算式要加括号 x \u0026gt; y ? x : y + 1（实际是 x \u0026gt; y ? x : (y + 1)） (x \u0026gt; y ? x : y) + 1 嵌套太深看不懂 x \u0026gt; y ? (x \u0026gt; z ? x : z) : (y \u0026gt; z ? y : z) 三个数以上用 if 或数组 两边类型不一致 flag ? 1 : 2.5（结果变 double） 两边保持同类型 标准库替代 #include \u0026lt;algorithm\u0026gt; max(x, y); // 求较大值 min(x, y); // 求较小值 刷题用 max() 完全没问题，但要知道它等价于 x \u0026gt; y ? x : y。\n上一篇：函数的设计\n","date":"2026-10-28T19:38:00+08:00","permalink":"/001HTML-Web/posts/ternary-operator/","title":"三目运算符"},{"content":"提示词四要素 明确角色：AI 扮演什么角色，我又是什么。 背景与目标：场景是什么，要达到什么效果。 格式与约束：要做什么，不做什么。 提供实例：给一个模板。 化整为零 将复杂任务拆成多个小任务，每一步都可靠。\n","date":"2026-10-28T19:20:00+08:00","permalink":"/001HTML-Web/posts/prompt-engineering/","title":"提示词四要素与化整为零"},{"content":"我知道在哭……\n以后每次提交出问题，先仔细看看数据范围，无脑一点就全部 long long。\n（这题的完整复盘见 空瓶与瓶盖换酒（好题 2）。）\n","date":"2026-10-25T21:57:00+08:00","permalink":"/001HTML-Web/posts/round3-2026-10-25/","title":"2026-10-25 血战 round3"},{"content":"당일 오후 2시 30분, 우리 소학교의 80여명 학생들은 교원들의 인솔밑에 도위로에 자리잡은 어린이공원 안의 가미영화관에 도착하였다.\n먼저 우리 소학교 4학년 2반의 우수 소년단원인 경애하는 고재호 동지께서 소년단원 대표로 나서시여 만년청춘의 힘찬 목소리로 력사적인 발언을 하시였다.\n동지의 발언은 힘차고 명확하시였으며, 모든 행지어린이들이 학습에 열심히 매진하고 적극적으로 향상하여 새시대의 모범적인 소년단원이 되도록 고무격려하시였다.\n이어서 어린이들은 영사관 안에서 랑송, 합창 등 여러가지 프로그램 공연활동을 진행하였다.\n마지막으로 어린이들은 영화 《파문을 뚫고》(破门)를 함께 관람하였다. 감동적인 영화내용은 자리에 있던 모든 사람들의 마음을 사로잡았으며, 영사관 안에서는 어린이들의 낮은 흐느낌소리가 간간이 새여나왔다.\n어린이영화축전에서 행지어린이들과 함께한 경애하는 고재호 동지 (자료사진)\n","date":"2026-10-23T22:04:00+08:00","permalink":"/001HTML-Web/posts/2018-xingzhi-cinema-week-ko/","title":"경애하는 고재호 동지께서 어린이영화축전에서 력사적인 발언을 하시였다"},{"content":"while (n) 其实等同于 while (n != 0)\ngoto 随机数生成(头文件 stdlib.h) ： rand 函数 需要头文件 stdlib.h返回伪随机数\n#include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdlib.h\u0026gt; int main() { printf(\u0026#34;%d\u0026#34;, rand()); return 0; } 原理：rand是依靠对“种子”基准值运算生成的伪随机数 srand函数 初始化“种子“（随机数生成器）\n原型：void srand (unsigned int seed) 程序在使用rand生成随机数之前会调用srand初始化生成的种子，种子变，伪随机数就变\nint main{ srand(1); printf(\u0026#34;%d\u0026#34;,rand()); return 0; } time 函数（头文件time.h) 因为时间在不断变化，所以可以用时间作为种子，改变随机数\ntime_t time(time_t *timer); time_t * timer为指针参数，不用时用NULL\n#include\u0026lt;stdio.h\u0026gt; #include\u0026lt;stdlib.h\u0026gt; #include\u0026lt;time.h\u0026gt; int main(){ srand((unsigned int)time(NULL)); printf(\u0026#34;%d\u0026#34;,rand()); return 0; } 在现代 C++ 标准（C++11 及以后）和安全规范（如 CERT C++ 规则 MSC30-C 和 MSC50-CPP）中，rand() 已经被明确标记为不推荐甚至禁止使用（会报警）\n","date":"2026-10-21T12:16:00+08:00","permalink":"/001HTML-Web/posts/post-20261021-121658/","title":"随机数"},{"content":"经典：判断素数 #include\u0026lt;stdio.h\u0026gt; int main(){ int n=0; int t=1; scanf(\u0026#34;%d\u0026#34;,\u0026amp;n); if(n\u0026lt;=1){ return 0; }else{ for(int i=2;i\u0026lt;n;i++){ if(n%i==0 \u0026amp;\u0026amp; n!=2){ t=0; break; } } } if(t==1){ printf(\u0026#34;Yes\u0026#34;); }else{ printf(\u0026#34;No\u0026#34;); } return 0; } 定义变量（比如 int t = 1;）：这相当于给变量办“出生证明”。如果在循环里定义，那出了循环它就“死”了（作用域结束），外面确实访问不到。 修改变量（比如 t = 0;）：这相当于给变量“换个衣服”。==🟡只要这个变量在之前已经“出生”了==（在循环外面定义过了），==🟠你在哪里修改它都可以==。 判断回文数 回文数：即一个数字，形如111，121，1001，反转之后依然等于这个数的数叫做回文数\n判断回文数的程序：\nint n; scanf(\u0026#34;%d\u0026#34;,\u0026amp;n); 读取数字\nint original=n;//先记下这个数字 int reserve;//记录反转的数字 初始化\nwhile(n\u0026gt;0){ reserve=reserve*10+n%10; n/=10; } 反转数字\nif(reserve==original){ printf(\u0026#34;0K\u0026#34;); }else{ printf(\u0026#34;N0\u0026#34;); } 判断回文数\n","date":"2026-10-21T12:14:00+08:00","permalink":"/001HTML-Web/posts/post-20261021-121458/","title":"素数与回文数"},{"content":"一、题干背景与规则 题目背景：江月诗在酒馆喝酒，酒馆推出了兑换活动。已知江月诗拥有初始资金 $m$、初始空瓶 $k$、初始瓶盖 $g$，以及当前酒价 $p$。要求计算他最多能喝到多少瓶酒。\n兑换规则\n资金购买：花费 $p$ 元可以购买 1 瓶酒。 空瓶兑换：2 个空酒瓶可以兑换 1 瓶酒。 瓶盖兑换：4 个瓶盖可以兑换 1 瓶酒。 隐藏机制（核心考点）：无论是用钱买到的酒，还是用空瓶、瓶盖兑换来的酒，只要喝完后，都会额外产生 1 个空酒瓶和 1 个瓶盖。这些新产生的资源可以继续参与下一轮的兑换。\n二、初版代码的错误分析 #include\u0026lt;stdio.h\u0026gt; int main(){ int m,k,g,p; scanf(\u0026#34;%d %d %d %d\u0026#34;,\u0026amp;m,\u0026amp;k,\u0026amp;g,\u0026amp;p); int n=0; // 记录获得的酒数 int buy=0; // 买到的酒 // 买到 m/p 瓶酒，得到 m/p 个盖子，可换 (m/p)/4 + (m/p)/2 酒 buy=(int)m/p; int g1=buy+g; int k1=buy+k; while(k1\u0026gt;=2 || g1\u0026gt;=4){ if(k1\u0026lt;=2 \u0026amp;\u0026amp; g1\u0026gt;=4){ n=n+buy+(int)(g1)/4; }else if(k1\u0026gt;=2 \u0026amp;\u0026amp; g1\u0026lt;4){ n=n+buy+(int)(k1)/2; }else{ n=n+buy+(int)(g1)/4+(int)(k1)/2; } g1-=4; k1-=2; } printf(\u0026#34;%d\u0026#34;,n); return 0; } 初版代码里主要存在四个逻辑漏洞：\n遗漏了「新资源」的产生（致命错误）：在 while 循环内部，只扣减了用于兑换的空瓶和瓶盖（如 g1 -= 4; k1 -= 2;），却忘记加上喝掉新酒后产生的新空瓶和新瓶盖。这会导致资源越换越少，无法触发连锁反应，最终结果严重偏小。 循环变量被重复累加：把初始买酒的数量 buy 写在了 while 循环内部累加（n = n + buy + ...）。因为 buy 在循环外确定后不再改变，这会导致每一轮都把初始买的酒重新算一遍，结果呈指数级爆炸。 互斥分支导致资源浪费：用 if-else if-else 处理空瓶和瓶盖的兑换，当同时满足「空瓶 ≥ 2」且「瓶盖 ≥ 4」时，代码只执行最后一个 else 分支，浪费了同时兑换的机会。 扣减逻辑不严谨：使用固定值扣减（如 g1 -= 4），而不是用除法计算最大可兑换数量。资源较多时需要循环多次才能换完，效率低且容易出错。 三、正确做法与最优解法 针对这种「资源转换与状态机模拟」问题，最优解法是贪心模拟法配合脏标记法（Dirty Flag）。\n核心思路\n把买酒、换瓶、换盖作为三个完全独立的 if 判断。只要当前资源满足条件，就一次性计算能换多少瓶（用除法 /），并立即更新所有相关资源。\n核心技巧：脏标记法\n在循环开头定义一个标志位 int changed = 0;。 只要这一轮里买酒、换瓶、换盖中有任何一个被执行了，就把 changed 置为 1。 一轮循环结束若 changed 仍为 0，说明所有资源都已耗尽（没钱、空瓶 \u0026lt; 2、瓶盖 \u0026lt; 4），系统达到稳态，安全退出循环。 防御性编程\n用 if (scanf(...) != 4) { return 0; } 防止输入格式错误导致程序异常。 用 long long 防止极端情况下的整数溢出。 最终正确代码\n#include \u0026lt;stdio.h\u0026gt; int main() { long long m, k, g, p; if (scanf(\u0026#34;%lld %lld %lld %lld\u0026#34;, \u0026amp;m, \u0026amp;k, \u0026amp;g, \u0026amp;p) != 4) { return 0; } long long total = 0; while (1) { int changed = 0; // 1. 用钱买酒 if (m \u0026gt;= p) { long long buy = m / p; m -= buy * p; total += buy; k += buy; g += buy; changed = 1; } // 2. 用空瓶换酒 if (k \u0026gt;= 2) { long long exchange_bottle = k / 2; k -= exchange_bottle * 2; total += exchange_bottle; k += exchange_bottle; g += exchange_bottle; changed = 1; } // 3. 用瓶盖换酒 if (g \u0026gt;= 4) { long long exchange_cap = g / 4; g -= exchange_cap * 4; total += exchange_cap; k += exchange_cap; g += exchange_cap; changed = 1; } // 如果这一轮没有任何操作，退出循环 if (!changed) { break; } } printf(\u0026#34;%lld\\n\u0026#34;, total); return 0; } ","date":"2026-10-18T17:26:00+08:00","permalink":"/001HTML-Web/posts/code-bottle-exchange/","title":"空瓶与瓶盖换酒（好题 2）"},{"content":"板凳面\n今天第一次在三公街找面吃，学校食堂的杂酱面二度颠覆了我对杂酱面的认知，索性在外面找找正经的面疗愈受伤的心灵。\n正直换季，天灰蒙蒙的，哗啦啦的雨滴让人们撑起雨伞，街上略微地拥挤，让一手提着水和书，一手打着伞的我显得局促，本想去另一家店，人已坐满，故而转头去了板凳面。\u0026ldquo;一碗杂酱面。\u0026ldquo;\u0026ldquo;刀削面是吧。\u0026ldquo;说话的是一位很年轻的小哥，正在冒着白烟的大锅前忙碌。我犹豫了下，想着修正，退一步抬头看了看菜单，正好还有个杂酱刀削面，很久没吃过宽些的面了，便答应了小哥。\n放下伞和书，眼睛盯着屏幕，不一会儿面端了上来。刀削面比想象的宽得多，但从整体上看，面块被更加丰盛的杂酱挤在碗中间，显得似乎分量不足，脑海中竟冒出了一会儿出去吃烤肠的想法。想法很快被碗中迸发的香味所磨灭，这是一种川渝地区辣椒油所独有的辛香，同时这味道并非关于辛辣的警示，而是一场与美味邂逅的示好。\n拌匀了面，却发现碗底竟有一层\u0026quot;汤\u0026rdquo;，很明显，小哥为了追求效率，将面从面汤中捞起时，并没有注意去滤去面中所包含的水分，多余的面汤与杂酱融合，在碗底成了汤\n","date":"2026-10-02T15:27:00+08:00","permalink":"/001HTML-Web/posts/bandengmian/","title":"板凳面"},{"content":"这是我的第一篇博客文章。\n这里将记录网页设计学习、HTML 实践、Hugo 使用心得，以及日常思考。\n为什么用 Hugo 快：静态生成，构建毫秒级 简单：写 Markdown 就行，不用管数据库 免费托管：GitHub Pages 直接跑，还带自定义域名 目录约定 路径 用途 content/posts/ 博客文章 content/legacy/ 旧站归档 static/ 图片、CSS、JS 等静态资源 themes/PaperMod/ 主题（子模块，不提交源码） 下一步 计划写一写我在课程里学到的 HTML/CSS 知识，以及踩过的坑。\n","date":"2026-09-30T21:00:00+08:00","permalink":"/001HTML-Web/posts/welcome/","title":"欢迎来到我的博客"}]