☰
组合数学计数法则:加法原理与乘法原理的深度解析
2026/10/14 1:42:25 网站建设 项目流程

1. 从“数得清”到“算得准”:计数问题到底在解决什么

组合数学里最容易被低估的,就是“计数”这件事。很多人一听“计数”,脑子里浮现的就是小学奥数里那种“从A到B有几条路”的题目,觉得无非是加一加、乘一乘。但真正做过算法分析、概率建模、资源调度的人都知道,计数法则才是整个组合数学的地基。地基没打牢,后面排列组合、容斥原理、生成函数全都学得云里雾里。

所谓计数的基本法则,核心就两条:加法原理和乘法原理。这两条法则看起来简单到几乎不需要证明,但它们构成了几乎所有计数问题的推理骨架。你后面遇到的所有复杂计数场景,拆到最底层,都是在反复调用这两条法则。区别只在于,有的问题需要你先做分类讨论,有的问题需要你先做分步拆解,有的问题需要你先把“不好数的东西”转化成“好数的东西”。

这篇文章适合谁看?如果你是正在学组合数学的学生,这篇可以帮你把计数法则的直觉建立起来,而不是死记公式。如果你是准备算法面试的开发者,计数问题是动态规划、概率计算、复杂度分析的前置知识,搞清楚了能少走很多弯路。如果你只是对“怎么把一件事数清楚”感兴趣,那更好,因为计数本质上就是一种结构化思维训练。

我个人的体会是,计数法则真正的难点不在于“知道”,而在于“知道什么时候用哪条”。加法原理和乘法原理本身没有任何理解门槛,但面对一个具体问题时,能不能准确判断这是分类还是分步,能不能把一个大问题拆成若干个可以用加法或乘法处理的小问题,这才是拉开差距的地方。下面我会从设计思路、核心细节、实操过程、常见问题几个维度,把计数法则彻底拆开讲透。

2. 计数法则的整体设计思路与方案选型

2.1 为什么先学加法原理而不是乘法原理

很多人会问,加法原理和乘法原理到底应该先学哪个。从教学顺序上看,大部分教材先讲加法原理,再讲乘法原理。这不是随意安排的,而是因为加法原理更贴近人类的直觉。

加法原理说的是:如果完成一件事有若干类互不重叠的方式,那么总方式数等于各类方式数之和。比如你要从家去公司,可以坐地铁、坐公交、骑车,地铁有3条线路,公交有2条线路,骑车有1条路线,那么总方式数就是3+2+1=6。这个逻辑非常自然,因为你在做的是“分类”,每一类之间是独立的、互斥的,你只需要把每一类的可能性加起来就行。

乘法原理说的是:如果完成一件事需要分成若干步骤,每一步都有若干种选择,那么总方式数等于各步选择数的乘积。比如你要搭配一套衣服,上衣有4件可选,裤子有3条可选,鞋子有2双可选,那么总搭配数就是4×3×2=24。这个逻辑稍微绕一点,因为它涉及的是“分步”而不是“分类”,每一步的选择会与前面步骤的选择组合在一起。

先学加法原理的好处是,它帮你建立“分类讨论”的意识。很多计数问题的第一步就是分类——把问题按照某个标准切成几个互不重叠的子问题,分别计数后再加起来。这个思路一旦建立起来,后面学乘法原理时就不会混淆。

2.2 加法与乘法的本质区别:分类还是分步

加法原理和乘法原理最容易搞混的地方,就是分不清什么时候该加、什么时候该乘。我见过不少同学,题目一复杂就开始凭感觉猜,结果一会儿加一会儿乘,最后答案错得离谱。

判断标准其实很明确:看这件事是“或者”关系还是“并且”关系。

如果你完成一件事,可以通过方式A完成,也可以通过方式B完成,方式A和方式B之间是“或者”的关系,彼此独立、互不重叠,那就用加法原理。比如“选一个班长,要么从男生中选,要么从女生中选”,这就是分类,用加法。

如果你完成一件事,需要先做步骤A,再做步骤B,步骤A和步骤B之间是“并且”的关系,必须依次完成,那就用乘法原理。比如“选一个班长和一个副班长,先从男生中选班长,再从女生中选副班长”,这就是分步,用乘法。

这里有一个很实用的检验方法:如果你能用“或者”把两种方案连起来读,句子通顺,那就是加法;如果你能用“并且”把两个步骤连起来读,句子通顺,那就是乘法。这个方法听起来简单,但在做题时非常管用。

2.3 计数问题中“不重不漏”原则的落地方式

计数最核心的要求就是“不重不漏”。漏了,答案偏小;重了,答案偏大。加法原理要求各类之间互不重叠,乘法原理要求各步之间独立完整。但在实际操作中,很多问题的分类边界并不是天然清晰的,需要你自己去设计分类标准。

我常用的一个策略是:先找一个维度做分类,确保每一类之间互斥,然后检查所有类合起来是否覆盖了全部情况。比如你要数“不超过100的正整数中能被2或3整除的数有多少个”,你可以先按“能被2整除”和“能被3整除”分类,但这两类有重叠(能被6整除的数),所以不能直接加。你需要要么用容斥原理减去重叠部分,要么重新设计分类标准,比如分成“只被2整除”“只被3整除”“同时被2和3整除”三类,这样就没有重叠了。

这个“不重不漏”的意识,是计数法则从理论走向实操的关键一步。很多人公式背得很熟,但一到具体问题就出错,根本原因就是分类标准没设计好。

3. 核心细节解析与实操要点

3.1 加法原理的适用条件与边界情况

加法原理的正式表述是:如果完成一件事有n类方式,第i类方式有m_i种方法,且各类方式之间互不重叠,那么完成这件事的总方法数为m_1 + m_2 + ... + m_n。

这里最关键的条件是“互不重叠”。什么叫互不重叠?就是任何一个具体的方法,只能属于其中一类,不能同时属于两类。比如你把“从1到10中选一个数”分成“选奇数”和“选偶数”,这两类互不重叠,因为一个数不可能既是奇数又是偶数。但如果你分成“选奇数”和“选大于5的数”,这两类就有重叠了,因为7既是奇数又大于5。

在实际操作中,判断两类是否重叠,有一个很直接的方法:看是否存在一个具体的方法同时满足两类的条件。如果存在,那就重叠了,不能直接用加法原理。这时候你有两个选择:要么重新分类,要么用容斥原理处理重叠。

还有一个容易被忽略的边界情况:空类。如果某一类方式有0种方法,那这一类对总和的贡献就是0,不影响结果。但在分类时,你仍然需要确认这一类是否真的存在,而不是因为你没想到就把它漏掉了。

3.2 乘法原理的步骤拆分技巧

乘法原理的正式表述是:如果完成一件事需要分成n个步骤,第i步有m_i种选择,且各步的选择相互独立,那么完成这件事的总方法数为m_1 × m_2 × ... × m_n。

这里的关键条件是“各步独立”。什么叫独立?就是每一步的选择范围不受其他步骤选择结果的影响。比如你搭配衣服,上衣选什么颜色不影响裤子有多少条可选,这就是独立。但如果你从一副扑克牌中连续抽两张牌,第一张抽完后,第二张的可选范围就少了一张,这就是不独立,不能直接用乘法原理。

在实际操作中,拆分步骤时有一个很实用的技巧:把“选择”和“安排”分开。比如你要从5个人中选3个人排成一排,你可以先选人(从5人中选3人),再安排顺序(3人排列)。但这两步不独立,因为选人的结果会影响安排的对象。所以更稳妥的做法是直接按位置分步:第一个位置有5种选择,第二个位置有4种选择,第三个位置有3种选择,总数为5×4×3=60。这样每一步的选择范围都是明确的,不会出现独立性问题。

3.3 分类与分步的混合使用策略

实际计数问题中,纯粹只用加法或纯粹只用乘法的情况很少,大多数问题需要两者混合使用。常见的模式是:先分类,每一类内部再分步。

比如你要数“从A地到C地,中间经过B地,A到B有3条路,B到C有4条路,但其中有一条路在维修不能走”。这个问题可以这样处理:先分类——走维修路和不走维修路。但更简单的做法是直接分步:A到B有3条路,B到C有4条路,但有一条不能走,所以B到C实际有3条路可走,总数为3×3=9。

再比如一个更复杂的例子:“用数字1、2、3、4、5组成没有重复数字的三位数,其中偶数有多少个?”这个问题需要先分类再分步。分类标准是个位数字:个位只能是2或4。如果个位是2,百位有4种选择(1、3、4、5),十位有3种选择,共4×3=12个;如果个位是4,同理也有12个。总数是12+12=24个。

这个例子里,分类(个位是2还是个位是4)用的是加法原理,每一类内部的分步(选百位、选十位)用的是乘法原理。混合使用的核心就是:在分类的框架下,每一类内部用分步来计算;在分步的框架下,每一步内部可能又需要分类。这种嵌套结构是计数问题的常态。

3.4 常见计数模型与法则的对应关系

有一些经典的计数模型,本质上就是加法原理和乘法原理的直接应用。理解这些模型与法则的对应关系,能帮你在遇到新问题时快速找到切入点。

计数模型核心法则典型场景
分类计数加法原理选一个代表,可以从男生选也可以从女生选
分步计数乘法原理搭配套餐,先选主食再选饮料
排列乘法原理5个人排成一排,第一个位置5种选择,第二个4种……
组合乘法原理+除法修正从5人中选3人,先按排列算再除以重复数
容斥加法原理+减法修正能被2或3整除的数,先加再减重叠部分

这张表里最值得注意的是“组合”那一行。组合数公式C(n, k) = n! / (k!(n-k)!) 看起来像是除法,但它的推导过程用的是乘法原理:先按排列算,再除以因为顺序不同而产生的重复计数。所以组合本质上还是乘法原理的延伸,只是多了一步“去重”。

4. 实操过程与核心环节实现

4.1 从零开始拆解一个计数问题

我拿一个具体的例子来演示完整的拆解过程。题目是:“从1到100的正整数中,有多少个数不含数字7?”

第一步,明确问题边界。范围是1到100,包含1和100。条件是“不含数字7”,意思是这个数的十进制表示中不能出现7。

第二步,判断用加法还是乘法。这个问题可以按位数分类:一位数、两位数、三位数(只有100)。每一类内部再分步计算。所以整体是“先分类,再分步”的结构。

第三步,逐类计算。

一位数:1到9,不含7的有8个(1、2、3、4、5、6、8、9)。

两位数:十位可以是1到9中除7以外的8个数字,个位可以是0到9中除7以外的9个数字。根据乘法原理,共有8×9=72个。

三位数:只有100,不含7,算1个。

第四步,汇总。根据加法原理,总数是8+72+1=81个。

这个拆解过程看起来简单,但每一步都有明确的依据。分类时确保互不重叠(一位数、两位数、三位数互不重叠),分步时确保独立(十位选什么不影响个位有多少种选择)。这就是计数法则的标准操作流程。

4.2 参数计算与选择过程的详细记录

在上面的例子里,有几个参数需要仔细确认。

一位数的个数为什么是8而不是9?因为1到9共9个数,去掉7还剩8个。这里容易犯的错误是把0也算进去,但0不是正整数,所以不在范围内。

两位数的十位为什么是8种选择?因为十位不能是0(否则就不是两位数了),所以可选范围是1到9共9个数字,去掉7还剩8个。个位为什么是9种选择?因为个位可以是0到9共10个数字,去掉7还剩9个。这里的关键是十位和个位的选择范围不同,因为十位不能为0。如果忽略这个差异,把十位也当成10种选择,就会多算。

三位数为什么只有100?因为范围是1到100,三位数只有100这一个。100不含7,所以算1个。如果范围是1到200,那三位数就有100到200共101个数,需要另外计算。

这些参数看起来都是细节,但计数问题的错误往往就出在这些细节上。我的经验是:每确定一个参数,都问自己一句“这个范围对吗?有没有漏掉或多余的?”这个习惯能帮你避免大部分低级错误。

4.3 复杂场景下的分步拆解实例

再来看一个更复杂的例子:“用0、1、2、3、4、5组成没有重复数字的四位偶数,有多少个?”

这个问题比上一个复杂,因为涉及“偶数”这个约束条件,而且0不能作为首位。我们需要仔细设计分类和分步的顺序。

先分析约束条件:四位偶数意味着个位必须是0、2、4中的一个;没有重复数字意味着每个数字只能用一次;0不能作为首位。

一个常见的错误做法是直接分步:首位有5种选择(不能是0),第二位有5种选择(剩下5个数字),第三位有4种选择,第四位有3种选择(必须是偶数)。但这样做的问题是,第四位的选择范围依赖于前面是否已经用掉了偶数数字,所以各步不独立,不能直接用乘法原理。

正确的做法是先按个位分类,因为个位的选择会影响首位的选择范围。

第一类:个位是0。此时首位可以是1、2、3、4、5中的任意一个,有5种选择;第二位从剩下的4个数字中选,有4种选择;第三位从剩下的3个数字中选,有3种选择。共5×4×3=60个。

第二类:个位是2或4。先选个位,有2种选择。然后选首位,首位不能是0,也不能是个位已经用掉的数字,所以有4种选择(1、3、5中选一个,再加上另一个非0偶数)。等等,这里需要仔细算:如果个位是2,剩下的数字是0、1、3、4、5。首位不能是0,所以首位可以是1、3、4、5,共4种选择。第二位从剩下的4个数字中选(包括0),有4种选择。第三位从剩下的3个数字中选,有3种选择。所以个位是2时有4×4×3=48个。个位是4时同理,也是48个。第二类共48+48=96个。

总数是60+96=156个。

这个例子里,分类的标准是个位是否为0,因为0作为个位时,首位的选择范围与个位非0时不同。如果不分类,直接分步,就会因为各步不独立而算错。这个案例很好地说明了:当各步的选择范围相互影响时,必须先分类,把相互影响的情况分开处理。

4.4 计数结果的验证方法

算完一个计数问题后,怎么验证答案对不对?我常用的方法有三种。

第一种是换一种方法重算。比如上面的例子,你可以换一个分类标准,比如按首位是否为1来分类,看看结果是否一致。如果两种方法结果相同,答案大概率是对的。

第二种是小规模枚举验证。如果问题规模不大,可以手动列出所有情况,数一数是否与计算结果一致。比如上面的例子,你可以把数字范围缩小到0、1、2、3,组成没有重复数字的三位偶数,手动枚举验证。

第三种是边界检查。检查是否包含了所有情况,是否有重复计数。比如检查0是否被正确处理,检查是否漏掉了某个位数的情况。

这三种方法里,我最推荐的是换一种方法重算。因为枚举验证只适用于小规模问题,边界检查依赖于你的细心程度,而换一种方法重算能从不同角度检验你的逻辑是否一致。

5. 常见问题与排查技巧实录

5.1 加法与乘法混淆的典型症状与修正

最常见的错误就是把加法原理和乘法原理用反了。典型症状是:题目明明是分类问题,你却用了乘法;或者题目明明是分步问题,你却用了加法。

我总结了一个快速判断的方法:看题目中的关键词。如果题目说“或者”“要么……要么……”“分为几类”,那大概率是加法。如果题目说“先……再……”“第一步……第二步……”“并且”,那大概率是乘法。

但关键词不是万能的,有些题目不会明确给出这些词。这时候你需要回到问题的本质:问自己“完成这件事,是只需要做其中一个动作,还是需要把所有动作都做完?”如果只需要做其中一个,就是分类,用加法;如果需要全部做完,就是分步,用乘法。

还有一个更隐蔽的错误:在分步问题中,某一步的选择范围依赖于前面步骤的结果,但你没有意识到这种依赖,直接用了乘法。比如前面提到的四位偶数问题,如果直接分步而不分类,就会犯这个错误。修正方法是:每确定一步的选择数时,都问自己“这个选择数是否受前面步骤的影响?”如果受影响,就需要分类讨论。

5.2 重复计数与遗漏计数的排查清单

重复计数和遗漏计数是计数问题的两大顽疾。我整理了一个排查清单,每次算完题后可以对照检查。

排查项检查内容常见问题
分类是否互斥是否存在一个方法同时属于两类分类标准有交叉
分类是否完备是否所有情况都被覆盖漏掉了某个边界情况
分步是否独立某步的选择数是否受前面影响直接乘导致错误
边界值是否处理0、1、最大值等是否特殊处理0被当成正整数
顺序是否影响结果是否需要考虑排列顺序组合问题当成排列算
重复元素是否去重是否有相同元素导致重复排列中有重复数字

这个清单里的每一项都对应着一种常见的计数错误。比如“0被当成正整数”这个错误,在“从1到100”这类问题中很常见,因为很多人会下意识地把0也算进去。再比如“组合问题当成排列算”,典型例子是“从5人中选3人组成小组”,如果你按排列算就是5×4×3=60,但实际组合数是10,因为选出的3人内部顺序不重要。

5.3 复杂约束条件下的拆解策略

当问题带有多个约束条件时,拆解的难度会显著上升。比如“从1到1000中,有多少个数既不能被2整除也不能被3整除?”这个问题有两个约束条件,直接处理比较麻烦。

我的策略是:先处理一个约束,再处理另一个约束。具体来说,先数“不能被2整除”的数,再从中筛掉“能被3整除”的数。1到1000中不能被2整除的数有500个(所有奇数)。这500个奇数中,能被3整除的有多少个?能被3整除的奇数必须是6k+3的形式,1到1000中这样的数有167个(3、9、15、……、999)。所以既不能被2整除也不能被3整除的数有500-167=333个。

这个策略的核心是“逐步缩小范围”。每处理一个约束,就把候选集合缩小一次。这样做的好处是每一步都只涉及一个约束,逻辑清晰,不容易出错。

另一个策略是用容斥原理。上面的问题也可以用容斥原理做:总数1000,减去能被2整除的500个,减去能被3整除的333个,加上能被6整除的166个(因为被减了两次),得到1000-500-333+166=333个。两种方法结果一致,但逐步缩小范围的方法更直观,容斥原理的方法更公式化。我建议两种方法都掌握,做题时根据具体情况选择。

5.4 计数问题的常见误区与避坑经验

在实际操作中,我踩过不少坑,这里分享几个最有代表性的。

第一个坑:忽略“没有重复”这个条件。很多题目会说“没有重复数字”或“不重复使用”,如果你忽略了,就会把重复的情况也算进去。比如“用1、2、3组成三位数”,如果没有重复限制,就是3×3×3=27个;如果有重复限制,就是3×2×1=6个。差别很大。

第二个坑:把“至少”当成“恰好”。比如“至少有一个偶数”和“恰好有一个偶数”是完全不同的条件。前者包括有一个、有两个、有三个偶数的情况,后者只包括有一个偶数的情况。处理“至少”类问题时,通常需要用总数减去对立面,或者分类讨论所有可能的情况。

第三个坑:在排列问题中忽略相同元素的处理。比如“用1、1、2组成三位数”,如果直接按3!算就是6个,但实际上因为两个1是相同的,实际只有3个不同的三位数(112、121、211)。处理这类问题时,需要除以相同元素的排列数。

第四个坑:在分步问题中,某一步的选择数依赖于前面步骤的具体选择,而不是仅仅依赖于前面步骤的数量。比如“从5人中选3人分别担任班长、副班长、学习委员”,第一步选班长有5种,第二步选副班长有4种,第三步选学习委员有3种,总数是5×4×3=60。这个没问题,因为每一步的选择数只依赖于前面选了几个人,不依赖于具体选了谁。但如果题目变成“从5人中选3人,其中一人必须担任班长”,那第一步选班长有5种,第二步从剩下4人中选2人,有C(4,2)=6种,总数是5×6=30。这里第二步的选择数依赖于第一步是否已经选了班长,所以需要仔细处理。

这些坑的共同特点是:它们都源于对问题条件的理解不够精确。避免的方法只有一个:每读一个条件,都问自己“这个条件到底限制了什么?有没有例外?有没有隐含的假设?”这个习惯能帮你避开大部分计数陷阱。

6. 计数法则的延伸应用与思维迁移

6.1 计数法则在算法复杂度分析中的应用

计数法则不只是数学题里的工具,它在算法分析中也有直接应用。比如分析一个嵌套循环的时间复杂度,本质上就是在做计数。

for i in range(n): for j in range(i, n): # 执行某个操作

这个嵌套循环执行了多少次?外层循环i从0到n-1,对于每个i,内层循环j从i到n-1,执行了n-i次。总次数是n + (n-1) + ... + 1 = n(n+1)/2。这个求和过程用的就是加法原理:把每个i对应的执行次数加起来。而每个i对应的执行次数n-i,本身是一个简单的计数结果。

再比如分析递归算法的时间复杂度,经常需要建立递推关系,而递推关系的求解往往涉及计数。比如归并排序的递归树有log n层,每层处理的元素总数是n,总工作量是n log n。这个分析过程中,层数的计数用的是乘法原理(每次二分,分log n次),每层工作量的计数用的是加法原理(每层各部分的元素数相加)。

6.2 计数思维在概率计算中的迁移

概率计算的核心公式是P(A) = |A| / |Ω|,其中|A|是事件A包含的样本点数,|Ω|是样本空间的总样本点数。这两个量的计算,本质上都是计数问题。

比如“从一副扑克牌中随机抽5张,抽到同花顺的概率是多少?”这个问题需要计算两个计数:同花顺的组合数,和所有5张牌的组合数。同花顺的计数需要分类(按花色分),每一类内部再分步(按起始点数分)。所有5张牌的组合数就是C(52, 5)。两个计数结果相除就是概率。

计数思维在概率中的迁移,最关键的一点是:概率问题中的“等可能”假设,要求你在计数时确保每个样本点被计数的权重相同。如果你在计数时把某些情况重复计算了,或者漏算了某些情况,概率就会算错。所以概率计算对计数的准确性要求更高。

6.3 从计数到动态规划:思维方式的升级

计数问题和动态规划有着深刻的联系。动态规划的核心思想是把一个大问题拆成若干个子问题,分别求解后合并。这个“拆”和“合”的过程,和计数法则中的“分类”和“分步”如出一辙。

比如经典的“爬楼梯”问题:每次可以爬1级或2级,爬到n级有多少种方法?这个问题的递推关系是f(n) = f(n-1) + f(n-2),本质上就是加法原理:爬到n级的方法分为两类,最后一步爬1级和最后一步爬2级,两类互不重叠,所以相加。

再比如“背包问题”:给定一组物品,每个物品有重量和价值,在总重量不超过W的前提下,能获得的最大价值是多少?这个问题的状态转移方程涉及“选”和“不选”两种决策,本质上也是分类讨论。虽然背包问题求的是最大值而不是计数,但它的思维方式和计数法则是一致的。

从计数到动态规划,思维方式的升级在于:计数问题通常只需要一个数字答案,而动态规划需要维护一个状态表,记录每个子问题的解。但两者的底层逻辑是相通的:都是把复杂问题拆成简单问题,然后合并结果。

6.4 日常生活中的计数决策实例

计数法则不只存在于数学和算法中,日常生活中也经常用到。比如你去餐厅点餐,菜单上有5种主食、3种饮料、4种甜点,你想搭配一套套餐,有多少种选择?这就是乘法原理:5×3×4=60种。

再比如你规划旅行路线,从城市A到城市B有3条路,从城市B到城市C有2条路,从城市C到城市D有4条路,总路线数是3×2×4=24条。但如果你还想在B或C停留,路线数就会变化,需要分类讨论。

甚至在做时间管理时,计数思维也有用。比如你有5件事要做,每件事需要1小时,你上午有3小时、下午有2小时,有多少种安排方式?这个问题涉及排列和分类,需要仔细计数。虽然日常生活中我们不会真的去算这个数字,但计数思维能帮你意识到:选择越多,可能性越多,决策的复杂度也越高。这种意识本身就是有价值的。

7. 我个人的实操心得与建议

计数法则的学习,我的核心建议是:不要背公式,要练拆解。公式是拆解的结果,不是拆解的依据。你如果把加法原理和乘法原理的适用条件搞清楚了,遇到问题时能准确判断是分类还是分步,那大部分计数问题都能自己推导出来,不需要记太多公式。

另一个建议是:多画图,多列表。计数问题的难点在于逻辑关系复杂,光在脑子里想容易乱。画一个树状图,把分类和分步的结构可视化,能帮你理清思路。比如分类问题画成并列的树枝,分步问题画成连续的树枝,混合问题画成嵌套的树结构。这个方法我在做复杂计数题时经常用,效果很好。

还有一个经验是:算完一定要验证。计数问题的答案不像解方程那样可以代入检验,所以验证需要另想办法。我常用的方法是换一种分类标准重算,或者用小规模枚举验证。虽然多花一点时间,但能避免很多错误。

最后说一个心态上的建议:计数问题做错了很正常,不要因为错了几道题就觉得自己不适合学组合数学。计数能力的提升是一个渐进的过程,做错的每一道题都是在帮你发现思维中的盲区。我当初学计数的时候,也是错了很多次才慢慢建立起直觉的。关键是每次做错后都要搞清楚错在哪里,是分类不互斥,还是分步不独立,还是边界条件没处理好。搞清楚原因,下次就能避免。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询