<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>jiangdu&#39;s blog</title>
  
  
  <link href="https://blog.satori-march.top/atom.xml" rel="self"/>
  
  <link href="https://blog.satori-march.top/"/>
  <updated>2025-02-14T15:58:44.000Z</updated>
  <id>https://blog.satori-march.top/</id>
  
  <author>
    <name>jiangdu</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>2025 牛客寒假 6 部分题解（E, D, H, I）</title>
    <link href="https://blog.satori-march.top/posts/OI/solution/2025-nowcoder-winter-6/"/>
    <id>https://blog.satori-march.top/posts/OI/solution/2025-nowcoder-winter-6/</id>
    <published>2025-02-15T08:43:31.667Z</published>
    <updated>2025-02-14T15:58:44.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="I-小鸡的排列构造的-checker">I 小鸡的排列构造的 checker</h2><p><s>看题第一反应是主席树</s>。</p><p>定义 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi><mi>s</mi><mi>t</mi><mo stretchy="false">[</mo><mi>x</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">lst[x]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mopen">[</span><span class="mord mathnormal">x</span><span class="mclose">]</span></span></span></span> 表示值 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 出现的下标（因为是排列只会出现一次），则每次询问中要求的区间排名即为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi><mi>s</mi><mi>t</mi></mrow><annotation encoding="application/x-tex">lst</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span></span></span></span> 上 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo stretchy="false">[</mo><mi>c</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">p[c]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mopen">[</span><span class="mord mathnormal">c</span><span class="mclose">]</span></span></span></span> 左侧在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mi>l</mi><mo separator="true">,</mo><mi>r</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[l,r]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mclose">]</span></span></span></span> 之间的数的个数，加上 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span> 就是答案。使用扫描线——离线树状数组解决即可。（如果你没有学过二位数点，类比树状数组求逆序对即可）。</p><p>赛时代码：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> n, m;</span><br><span class="line">cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line"></span><br><span class="line"><span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">p</span><span class="params">(n + <span class="number">1</span>)</span></span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> &amp;num : p | views::<span class="built_in">drop</span>(<span class="number">1</span>)) &#123;</span><br><span class="line">    cin &gt;&gt; num;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Query</span> &#123;</span><br><span class="line">    <span class="type">int</span> l, r, c, id;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">vector&lt;vector&lt;Query&gt;&gt; <span class="built_in">queryByCVal</span>(n + <span class="number">1</span>);</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; m; i++) &#123;</span><br><span class="line">    Query query;</span><br><span class="line">    <span class="keyword">auto</span> &amp;[l, r, c, id] = query;</span><br><span class="line">    cin &gt;&gt; l &gt;&gt; r &gt;&gt; c;</span><br><span class="line">    id = i;</span><br><span class="line">    queryByCVal[p[c]].<span class="built_in">push_back</span>(query);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">lst</span><span class="params">(n + <span class="number">1</span>)</span></span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    lst[p[i]] = i;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">Fenwick&lt;<span class="type">int</span>&gt; <span class="title">tree</span><span class="params">(n)</span></span>;</span><br><span class="line"><span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">ans</span><span class="params">(m)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> val = <span class="number">1</span>; val &lt;= n; val++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> q : queryByCVal[val]) &#123;</span><br><span class="line">        ans[q.id] = tree.<span class="built_in">GetSum</span>(q.r) - tree.<span class="built_in">GetSum</span>(q.l - <span class="number">1</span>) + q.l;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    tree.<span class="built_in">Add</span>(lst[val], <span class="number">+1</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> num : ans) &#123;</span><br><span class="line">    cout &lt;&lt; num &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="H-小鸡的排列构造">H 小鸡的排列构造</h2><p>我讨厌构造题…</p><p>猜测无论输入如何都存在满足条件的排列（即任意奇数或者偶数长度区间都是全错排），试着构造：</p><p>当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi><mo>−</mo><mi>l</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">r - l + 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 为奇数时：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">n=3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span> 的情况平凡，<code>2 3 1</code> 或者 <code>3 1 2</code>。以前者为例，考虑以此构造 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>4</mn></mrow><annotation encoding="application/x-tex">n=4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span> 的情况，设第 4 位为 <code>x</code>，由于后三位 <code>3 1 x</code> 必须满足全错排，因此只能是 <code>2 3 1 1.5</code> 的大小关系，即 <code>3 4 1 2</code>。同理构造 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">n=5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span> 的情况：<code>3 4 1 2 0.5</code> 即 <code>4 5 2 3 1</code>，以此类推，不难看出规律 <code>n-1,n,n-3,n-2,...</code>。（如果从 <code>3 1 2</code> 出发能得到另一组构造）。</p><p>不太清楚“对于一个任意长度为 3 的区间都是全错排的排列，任意长度为 5, 7, 9… 的区间也是全错排”怎么形式化的理解或证明，但是观察我们构造出的序列显然是满足的。</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi><mo>−</mo><mi>l</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">r - l + 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 为偶数时同理，可以得到构造 <code>n, n-1, n-2, n-3, ...</code>。</p><p>赛时代码：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> n, m;</span><br><span class="line">cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> parity = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= m; i++) &#123;</span><br><span class="line">    <span class="type">int</span> l, r, c;</span><br><span class="line">    cin &gt;&gt; l &gt;&gt; r &gt;&gt; c;</span><br><span class="line">    parity = (r - l + <span class="number">1</span>) &amp; <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (parity == <span class="number">1</span>) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = n - <span class="number">1</span>; i &gt;= <span class="number">1</span>; i -= <span class="number">2</span>) &#123;</span><br><span class="line">        cout &lt;&lt; i &lt;&lt; <span class="string">&#x27; &#x27;</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">&#x27; &#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (n % <span class="number">2</span> == <span class="number">1</span>) &#123;</span><br><span class="line">        cout &lt;&lt; <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    cout &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = n; i &gt;= <span class="number">1</span>; i--) &#123;</span><br><span class="line">        cout &lt;&lt; i &lt;&lt; <span class="string">&#x27; &#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    cout &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="D-Viva-La-Vida-Fried-Chicken’s-Version">D Viva La Vida(Fried-Chicken’s Version)</h2><p>虽然题目是无向边，但是我们先将其看作有向边。画个简单的图，结论其实就一目了然：</p><p><img src="/posts/OI/solution/2025-nowcoder-winter-6/D.png" alt="problem D"></p><p>（剩下的边用更大的数补全即可）</p><p>边权就类似势能一样，从高走向低，因此不能成环（重边除外）。由于出度为 1，所以每个联通分量一定有且仅有一个重边，所以数重边个数即可。</p><p>由于边权是排列，没有相等的数，也就是说对于一条重边，它的边权就是和这两个点相连的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>n</mi><mo>−</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">2n-3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span> 条边里最小的一条，概率 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mstyle displaystyle="true" scriptlevel="0"><mfrac><mn>1</mn><mrow><mn>2</mn><mi>n</mi><mo>−</mo><mn>3</mn></mrow></mfrac></mstyle></mrow><annotation encoding="application/x-tex">\cfrac{1}{2n-3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.3593em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.59em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.74em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span></span></span></span></span></span>。由期望的线性性，总期望就是每一条边的期望之和， 即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mstyle displaystyle="true" scriptlevel="0"><mfrac><msubsup><mi>C</mi><mi>n</mi><mn>2</mn></msubsup><mrow><mn>2</mn><mi>n</mi><mo>−</mo><mn>3</mn></mrow></mfrac></mstyle></mrow><annotation encoding="application/x-tex">\cfrac{C_n^2}{2n-3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.3593em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.59em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.74em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-2.453em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span></span></span></span></span></span>。</p><p>代码略。</p><h2 id="E-任造化落骰">E 任造化落骰</h2><p>参考官方题解的做法，先用单调栈预处理出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mi>x</mi><mi>t</mi><mi>M</mi><mi>a</mi><mi>x</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">nxtMax[i]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">n</span><span class="mord mathnormal">x</span><span class="mord mathnormal" style="margin-right:0.10903em;">tM</span><span class="mord mathnormal">a</span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span></span></span></span>，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span> 之后下一个改变 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>max</mi><mo>⁡</mo></mrow><annotation encoding="application/x-tex">\max</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mop">max</span></span></span></span> 的位置，然后枚举左端点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span>，用双指针处理 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>max</mi><mo>⁡</mo><mo>×</mo><mi>min</mi><mo>⁡</mo></mrow><annotation encoding="application/x-tex">\max \times \min</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7512em;vertical-align:-0.0833em;"></span><span class="mop">max</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">×</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop">min</span></span></span></span> 为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi><mi>a</mi><mi>l</mi></mrow><annotation encoding="application/x-tex">val</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span> 的二元对的个数，做个后缀和，每次询问二分找要的值就行。</p><p>代码：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> n, m, q;</span><br><span class="line">cin &gt;&gt; n &gt;&gt; m &gt;&gt; q;</span><br><span class="line"></span><br><span class="line"><span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">a</span><span class="params">(n)</span></span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> &amp;num : a) &#123;</span><br><span class="line">    cin &gt;&gt; num;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">auto</span> calc = [&amp;](<span class="type">const</span> function&lt;<span class="built_in">bool</span>(<span class="type">int</span>, <span class="type">int</span>)&gt; &amp;cmp) &#123;</span><br><span class="line">    stack&lt;<span class="type">int</span>&gt; St;</span><br><span class="line">    <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">nxt</span><span class="params">(n)</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = n - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">        <span class="keyword">while</span> (St.<span class="built_in">empty</span>() == <span class="literal">false</span> &amp;&amp; <span class="built_in">cmp</span>(a[St.<span class="built_in">top</span>()], a[i]) == <span class="literal">false</span>) &#123;</span><br><span class="line">            St.<span class="built_in">pop</span>();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (St.<span class="built_in">empty</span>()) &#123;</span><br><span class="line">            nxt[i] = n;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            nxt[i] = St.<span class="built_in">top</span>();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        St.<span class="built_in">push</span>(i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> nxt;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">auto</span> nxtMin = <span class="built_in">calc</span>(<span class="built_in">less</span>());</span><br><span class="line"><span class="keyword">auto</span> nxtMax = <span class="built_in">calc</span>(<span class="built_in">greater</span>());</span><br><span class="line"></span><br><span class="line">map&lt;ll, ll&gt; bkt;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> l = <span class="number">0</span>; l &lt; n; l++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = l, j = l; i &lt; n &amp;&amp; j &lt; n;) &#123;</span><br><span class="line">        <span class="keyword">if</span> (nxtMin[i] &lt; nxtMax[j]) &#123;</span><br><span class="line">            bkt[<span class="number">1ll</span> * a[i] * a[j]] += nxtMin[i] - <span class="built_in">max</span>(i, j);</span><br><span class="line">            i = nxtMin[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            bkt[<span class="number">1ll</span> * a[i] * a[j]] += nxtMax[j] - <span class="built_in">max</span>(i, j);</span><br><span class="line">            j = nxtMax[j];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">vector&lt;ll&gt; vals;</span><br><span class="line">vector&lt;ll&gt; sufSum;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> [val, cnt] : bkt) &#123;</span><br><span class="line">    vals.<span class="built_in">push_back</span>(val);</span><br><span class="line">    sufSum.<span class="built_in">push_back</span>(cnt);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = sufSum.<span class="built_in">size</span>() - <span class="number">2</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">    sufSum[i] += sufSum[i + <span class="number">1</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (q--) &#123;</span><br><span class="line">    ll k;</span><br><span class="line">    cin &gt;&gt; k;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> ind = ranges::<span class="built_in">lower_bound</span>(vals, k) - vals.<span class="built_in">begin</span>();</span><br><span class="line">    cout &lt;&lt; sufSum[ind] &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;I-小鸡的排列构造的-checker&quot;&gt;I 小鸡的排列构造的 checker&lt;/h2&gt;
&lt;p&gt;&lt;s&gt;看题第一反应是主席树&lt;/s&gt;。&lt;/p&gt;
&lt;p&gt;定义 &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xml</summary>
      
    
    
    
    <category term="OI" scheme="https://blog.satori-march.top/categories/OI/"/>
    
    <category term="题解" scheme="https://blog.satori-march.top/categories/OI/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="OI" scheme="https://blog.satori-march.top/tags/OI/"/>
    
    <category term="牛客寒假" scheme="https://blog.satori-march.top/tags/%E7%89%9B%E5%AE%A2%E5%AF%92%E5%81%87/"/>
    
  </entry>
  
  <entry>
    <title>[游记] ICPC 2023 杭州游记</title>
    <link href="https://blog.satori-march.top/posts/OI/travelogue/ICPC2023HangZhou/"/>
    <id>https://blog.satori-march.top/posts/OI/travelogue/ICPC2023HangZhou/</id>
    <published>2023-12-20T00:00:00.000Z</published>
    <updated>2025-02-12T18:52:43.000Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="d1834a82eff52c827e1df0a09c89aa9388486da6608e4498989ca1e69f5f4b23">1e841e7579db121a9c9d872c6d9be32262a4d7783f3cba2468375e323fb7433dc25c007870505fc88bfb9431ce0c7504866d117a3b27ca8e6515b93af5d686cccafb37ab38c114314c22559571a002ab03ff52bfd9ba267216aaf9c99426dc06875f0f3e862df066cb6e95dbdb2b4b561a0ec628b327aef5fadc33e5c4b31e1c7c88e3a6f61d3f73dc39d2f5e443229a1aaedbbfb1d5c0b0a115a11b0d226af81bc4bfa726b22dcb708b04d015532b42a38bc712e8ecc6c2da25d696b642a205d7fa95b4e0f308f10fb833fc3eb20ac604193c15e7298eeaec2f7c28862ca8a51c9c9c736ed5cb27ef29401bf92f8a6205815d2b184903917a6312da215c1e13334ade9164779d14849c8c226c404e81b1229f72731d482d83ede5cf7dbd6dda666c05c2dea2410ce926aee654fbce0634b65328c39edb454eec1071faff7a38831784e72f2a31b686e44d27668527a0a87ee21363c126dd4ae2384f53883bec384a9c123464ae74acc16cbed7f8109553d6b75db0466f7ae99fdbdd97c4c2b6ebddc4c136b931d2fc9d5c6bcf83fe8dfb2e5ea67f229bd3bfb6e441b6ca0922fb7d76080c09d797b329f8b2c926d8c5f255d6439167cf7ad814eb2d6f509e9aef47c2aeddf094087780efb2050fa4b97932db51c9dfbbe6d16688367deec8db2932e3735b4196de792d1636ecffd830f99198f14713019d281c9c3511a1638b5803a5de7b2c24ea8bb942720158dd88a90748eb83991559dc1b8082bb02e6b770b16f1372d6b183753500734821c2d62c52946cdeb59204229c7432deb4c24e83c4588931ff32638395310a38ae18f29c79b2fc0cb12d20d429400a80874512ca94581ad0cfd170da1fc08e210da40569a9cb67d1a16558f963a2dabc75a00b5323486a5ce07abd080d2e13d45c6135230cda3be1fc79811f70378e0a595a8674e6c0ff3ce7405c6983e121907ae733a186c1d6f7cd75b29f3c75a5d2cb7d5706dd9bf6332fe83508bb3ed3d52268ac592f9844dc5d29dc4d28063e9e0dc136fba17053a588d4109119a3b43b36e2faa65f545fb5ecc87f43dd2308762d85f1fe2fbd547ecbb301fe73c8b24fadce4f9723518e2741dd8acf1d7b50d16c92321d9f58ce621d714a7558be8b9fb5af3c5916cbd8097c9e3971202a65b5635c2c1b6eeb7cdfff3d51c47c95d65152dcc82a95bd2ad34bbd37a74611262130dc71ca2c84cc97e0d0cc80942d8a70cbca3ac5cb31754d2fa5e61500cdbfc6a6c8ca228def0b8bf6ee6800526dfd043b3fcc40430e5cc1e3e0f806cd975d6c7bc96c2d261a4921a1aaa5b55d75cce1f664ec0c6bdc607fa777a20a963a17f982834b7f02c6566839d0bac544efff572e144baf533d6597f1cf8548a8add2c48d2dc1bdbd5f54f89d06e30080fed45f2b33b392e8cefd816e7287ade0fe7e25a658281faf79966eaa3ecb0bd0cc1f1061380ee7d7b527c04a41a3a9a07317bf3d0ccb36e291e625e989a523a457ba793539c796295f87fd8bee9ce8c652a5ff7e6f04ed594a4ae3aa7d900cdd1268207a950ee0659c855800c616b9b39917bc9f320edc2c63d867a6a256e015423de62763c3d9bc386fac1d522d318f76fc1f47740e6b5d23ccfbe407475254b3ef3db25a511bf644dd53fa9c6a3a9cb635158cfb6bc358c75df26f1d95cd62182fe21347dfa34d18237abf186729d89dab49404cec00d35397f9a3c446d7b78a56c7fe942cd02401fee43e8cfa0a307ce95a46092e84e5876f7bafc062c7d980a65330893198211e937576311c630e522efd1301dcc59d8c7224e8f1424fe96cc73ce70386813a17fa717a8a9e537207aac15ead6ef76f027abcbf4f745910888a29779d81ca32e2d663c991e74755a4cf98469c7a0530bc9eedf6c2ed645ed84c20904c837c80e8818395410ad1b1beb70e3b40c0bc0df14095f9657dcb9d4ad3968cc79558f793cd31e193755c92077cf38332e821ff39571d806e3fdda3720107ba1cfaa74f969690a54d8b431fc90dacf4ccefb269250859ba337e287af39f3b1b8e273632170cb249e041cd19480c3e9da476f830b783d997ccfac5dd642ed8d344022908048d11c53f9c992bb218df8167f8566843d690fd42883e51d0b034140d92e38f01f0012e48b1de3ed6f1fe115f9d35e2e883ac17e1afbb1a11badfdc4b9a759c63150fbe10809d67b9b65d40d0a0630d404a8ff862545ecc544660770d9b48c692f059fa54a3434a05f2156566f8d5db52dbc62c1deb856db02bd22285f58624ae87a10db2d477e1b165c2b3e55be0e36f8dd170b9f503a2244693fd438c216b01e72e695f8f55b26323882976ff00b6d4a861a8f5ab915f90ca94cf014662f7b64835ca9bf468b0a53ac717b7ec250d89fcafad1fb1178741e49fe089675df3a1d2c4064befde441bfcd0cd9dcf0c6748128ea220759e3a4cba14a454e0654a5e0445bbc5df945fa7c26a1d7eda7c7b44a8a9b1bb3adb7aec855765ffc77676267507d6ddd8c98763d85bf4e54a0f4b4b1898f6f95f96fc703ecd29bc7131b829788209b531773a2de766078755b9d3e9d39cb4ccd5d55171dca1a6d2d17f13404a2c81d44dd756c9ddc484b4c3fa53d417adbdcbc83cbd4d5e31b90de83895c8c87a264ce311aabf7fc6e18702921d0b3c90d0a14d2ff4c6914a8b57ac77cfc407f7582cec0d6590370a6e1609687475d295f8aa3b979b2d47d7a0ed39df8d71f9f890907ef4a4964f64ed9ef912bed996f6f96647c54b92fbc648168fd443f24a9de936a5a1fae3c77ab3115dcb6d5d88d2d96be5461f0eecf6334ead18f20329f5d714a9515722592b4c3489fcc91a145a53635a76871eaa42b29dfe99f6cab1d9a1a31b4edff370e8c8f275b38919b60ea001e3ca5620944d7b3caf80e5f32a3b11dfeeec9fbddf2f91c538dcf2dff65fec32a2ce3e0349936621e036f6c75594bcf3fd66dd7b18b8205cc41c11cd4af0bef48da794cb65cdc1c651b71da2cc4b0da59fd58a8274aeca6a25c2ff6b0f28c6cf85146eeb900affea916cebf8a995f8813308a41f57bd0653300b28b68492bad2beae0014582cf8e348b69f380c9936a4f77c9599dac16abee712e9ceeed24ff7a2a736e0e6376ebdb999ca0085652d7d6cdd9eb07dd679faf92c8b9b8194cf8c82c310e2b6a254be9677ae87ab46fbb9b01675d01d3717b092932d1cfa943e761a39dcc5b19e6811502166fb044c7fe02c219109464f536f4178e0a896c724152e0dc923bdd180968cbffaf26f620fd1374cf79422bac766c1619a7f90f4c18c8f700040c2979006c3644db24bfc12e99dc8f28547657e133f59b2142d15a46936eed13e2bb1e499cf1b1f3a84c73dc2498ea291b2e8121ea1b5da6610db7950002e59c56fed20f851dbd071923e3254fa112b7311af0897061c8748ec278f32c3acbd2b5517d4330e8eb3054c2f4a539cc48b8eeb15721c49ec09d449a651e5fbf46a5d58f9af68a5988a7fe58d951cdc4f85081bb7722fe59f3945377370e9fb1df871ff408237f6f5ee5eb4941bfad8ce032f9e2403e19ce165bb6f800cfb6a15bee9a890a126b5df9dbee3b9bafc40fe8a312d536eaf5a82a8c42380f243d841b8b7f880e438dd394510569c0df03bf0c9cca8e12628521fb1be0abd73b548a3d93e485182cc781b220de4fd08770107b93f27dc57b161454fb2881844fecfe5af2dc8258428104f72910e3de7883605a52adceb31ef5f737ea0b67a6cf8c3cece344d3b73f301b9005180b5e99078326e114a1dda44b153e6d0c69abe17274b1eec60fb6f16a31cf3c75325fb83bf83c46dde12567d5b56cbadf5f8d663ea49a1b41e48921eaf5f35a97067efce811fffbdcaf31ad912c8a8835c91a679c206ab3ce7f2a6d7817092598e19a7dd56111ff101ca107366ccb0c7b3d44297dbdb8bc2fb33987a8a8eaa2571d5ead554737873c8b3587bd1d15f9fb0b1dfaa390be2a84fed2779525a0026786b669c86968db436cfdd9739c5cb98ff1920d7fa33777c099e9e5aa110ab1379bb73c1b32716ac505cd93b4f18db1b20628e025d10d041ab318c4ae477b8baa7a95d82d6ece6cebcc41d314a276fee58be6e90d23e6609b9e3e51857db82c99aae4f728ea88132e0d9c35d215ce968295d4ce90d8019b9caa61a690a9df1ed9dfb79ca2dbe5b927db6e1e37f7c47347d7197e6e7f437dd4a882d168ea6ff8c485f4a6f2d1e35aa2f3f1f5c9bf845a4df94a4b99617d15de26adbfe2aaf702c91b3b6122b4c81d5de9400783c9eab7d697811e7e5425d5cabe53dc258d19bdd7ce7bdcf2e06b55fad45d65feb0cec84ee4bc9223e4de8ce1ffb814a367b9306cd2490e48a2979a467cbab445a7a26b0aebab9483ad8451d3ea28c1c201a601a820d4caa9a080e85156ff40587be15d0f183e9765af0e12905668af562de3a3c47ffeaced70997625065a795002c670617d431eb4216879f1f5cda8b85795c22305d58b92b5cf5ab047101422a2bd3b7882e5aea24780e7546549b1e2539dedf8ee6a22b74cb59154bd8196305aec1c1d11b2e2ecabdcce9ba26669d814bc95b592395ff20d6f2fc13331d4d6b82e13fbd1a8b7032cdabc26c6f8619efd8f30e318fcf635105f4b92e0280f141a967ddc984b7672ed1fc2a22e2aedcee4460e00d95bc52f213732cf727d92662309d2b707d969a1f998ca78e3fe18702d067141efdc14a2978f01ed83146b167dac70a7808caadd6714fc477f7f9332a11ddf55a2e7f478f326c9d7006680b982061e11f04a8bf22e42f08eec81ccb5affa1828e104dd9b8e73a67bdc443350db73407498285eaf1a954a9bdc96e64ad4aee42e98d0167c7815bbe9bf7a685a68a94dc37de14c6c47d93e2499b43ff24cb9a9a5547f65c8c8d3b6da28d7c62cc49dfcae5ef23e0f003c3800fafe210009426efc54057c27c68529c4edc69e57f40fa8ee3862680c04f92b7b4d688c343e62bdd50f7cd3fb5adba6378c97e60daa20e935ae8815f525edd7ce1bcd4f468c3d98c26d33223d25965ef5c14b46076816f682a18c36ec4f848d188b3a3ec00156c56bcd03d17fb839bf1f923102137e98f29dbe185840c842560e81d2b46ffaf34c1727631cb24f463ecbbd1a24c574beaf56194a538c0011cdddd8708f3d6013307026ea60325340bc5c7b94ac5eefddc0913ad2d21ed9c20c4968552f7e14a94c163773817e1c3216fd41268562f7d2cff3cd33d032f211fe2c7343cf56b029d94af1a27f7e895d4d037b5d31c1d67c0ac4ddecfbe62b78da1968cad5d74ddee7be21fab6d27d17e2f03a77cf1475f0c8510c4697ff1045a88fe7c746c734e20af5046d75ec6fd100b6c932178a1f504f8e673c742b97d71ee75591eb38c60393ba7ec459130afbfe79a34c170f5dabd59cb6f487b5d5ab85efeb8db1f1060aae3663e78298712004f0deb1695f40c0124838839dd1509f720a8ae58694e6c8a4c2f046dbabeb981e2d452f9eaa14faa6bc7787abd649e5aa9d761f9eff56040d19f2acf8089e4758f5be0f872e43b2840f411c095ab23e95994480b8b46b65c320ee916f7fd5108673bdeee3231436e7617eaba4bcc173c95c6bc406a2a088229dcffbab0dc8a53e39bd765148dcf930cc5facfa511db2fe13b9b535e8456ea3284d089936915c4fe633b5a6431c4a1d8fe3774057cfefa13270d602249aebf86082daced85df7f32b15b2d622f3e982f4120a07091970451af4c785d90a7fac0e40a79448ed895ce4b4cc44515ea316edd7dde0c94b5d804eca1dc8cdf0bf0e8ec5694bc48f46090099073760a41ec577e250aa8ca2b5a4e5c305cbbc1b3d5ba1177b263dbde8306e6a6a1e9d4e17ce993e49697a40dbb81ca20a26457332317ac3765cccc9095ed5c0a5f7676e04bdbc4944c4ff353ed684b3e513d4ab8e48bd34ad4b27840f8e0d99569e8bbf81906ec65e2762290f404006bdf1a46221787ab9666ea64748f07055a2ae575ad15d972e6cee0b2bbb7634b118c5c42664d8e7e74a312aa19be8319a8432e82944061167888c5e1a320719b679b144f264cb4621ddfea7bc863aa0011d0bad47f9473ced86eab4737fa42b0ec2db397b53a1525a766b899ef00bf7569b602ee9d9d8bf9cd13bde5039193b3f7a3b547ed249861d8757b5f88d8eef285a47ae6cfa216ab9b3a4869c7b1d78615b0ba62339e46a665826db6ef8d186e79071f68f106f7777be0bcc294141fd62784419e9c1013b0b44faa88da08439aa00bf37c63dcbcac969f5b78f5ebe70b136eed2a3bcf503f7f362160b57e64c4d877ed03488b02fbf0bced95cb6096955c2bb58c0add4881449ecf470ddb548ebd31420f7c287d57a30f1c95b2cd99254347cc3fbf10f2e55a9fa6098eaad0f7091791847597227f5570de500d01f5e0c633857248a13961a61366151f4b32ea6e405fc72674539636ba1c4ef1e53c2c5ebdd47e7151aef8c1be17f386ac56a70201b4b7128833bf2634782ddd61ffde90dcdfc1cbe642b0a956c3ddcddba8aea608fbffc3fe435276d2bc4f2da2adce588cc84f8625335aa69b79a895d8faf91ba88625877e56e481df9a2ab6bcc7bd372cc6c414466c12993ee635e94f6f85e6ab43df43c05addf58ff3b4a94ad3070361de38f7e8717af1e4a52a361c3d5c76e4ffdc85ba92f353472d131714b791407bee9e8f7f58166f82c9bc4c0e99f5d1d136c0114f4242110cbf177df6ddcad783b1d8400fa2a935c9ba12a2b03606cbceb6e28d27a93dc8913c42535e2653bf9fd470225086649d76dd9596aa70cf288c425da8efe51df5f8b873c4498f4d652b331ab878a44c3da019b873f491727ad7de68a9db2dc3e7a73bbb7f044511670f5fc3aec531515800bb19e22f4f6a66b86ce14eb0b98f57dea1065a676dc04bff20afeb0642eb3ae7b5317666c6742319d99b6dcc5df3415f9e2b310601595645994668859a508d2f593b47c6de937688f95a3b0adf3d7c39c0cc34c3f9208e36883c7513bf67742c946c74ce0b5c4cc2c1a5a0ae0fc793ce801e5a0fef800ea7673a3e0e41055cbbe47cf4ffd249bf181ba9a256e3f382698b4a101e114b631defb84c4213d8030272193112dbb4a6003d9a8e078a28e751af15352a972027ad81945f594cec99017e7dfb8a92ec7f2d6a4c504fa1d6f7aaa34a18807bd057112451f43f50862418c7e97b551f24913486e1d9342153492b46fdfa4889f89822825c0a44ffd29983e56a88ed8e2fc879497b955ab560fe9446d2b75b64eaedcd448eaaa6559c2276954ce159f2bab9a24396fea02262f8146f29e6ef0155e7734639f2ba6f1e5f0dbf8b84e3acc9512b6d7d0f9430144f6d0e1115e402c229e8f12d3f61d7d7fcb0a6b2392307b60fb0c7cc46e40df11df226e4bc2dd192eaa850a4c52df7d30b18b04830fb0a57713cfbfba0990a96f7967b337fd3b2622c63ea1307bdd8fa177a2c614f5e69b8b861001ef7797fadfd07015e027288f340f0b900d5ea36f3864cc407e216c4ce575f84d35cdce6eed5ddff28b47735265e6f7c67e6e15cd5aa8090a9448967ab442e302a7d935b20bdc7937ff899b174b339ab1dc21bb5fa3cf9c9b414ac631e1b148c622eb1cfad9744600f5dcb600bae439f6ea6364f96f78cedf9a2f389d4b4468a4385964ddacd464fa0534ad92dd4c6f1e0700146966b3bcd20f3035e4d20bdb1eb1763af85f18fcef68c47d34450bc5ce2911605806887296ef3a9ce349824b816956b11f8855cb0491112e95eaac4a0e961ecc1fdaf958d56e830e5ec62519f0a9b3b84b8a03febe40b67f8fa460099a3d686ecc254a41274248c095cce65ca5074853c836593853d9828c0eec3e318c0eaf611b15e27eb5d09d214bc372a28de059e51f7fc0048e1a11f99a2ab5c3a3d9b70d45c453cb8b5a9279aed7bfd8f166f49232ea031c265e76251c9d0cca585af0b0854ee5c5c21805cfb6d13501ce9f43429bd771b3d4346740516c2afe004019d7b3e94a903dd9fb37850a8b35165f9a9fdc012d231663783eaaef28d1d9061127f1bce3223813e74eb20435afa6d380436599533ceca219d7fa2237d5fcfd87b695ca3888ca1b1ff41189d1b05d28a6751a23e80a526100aa9fb15d5aca99842d4304e75a385fad31b65a67822e31cd94ca9c92831c309f6b0d76709458bbc38dcb934942b3a4f263c90d5aef6b35a63e96a421c791daf7ea156011b9ef241735ce27558096c610b09cbf3e1c4fd8b0959bf722bcffa73816a104d58f42f08222b9020a262ea6f7ea7ff7ff9ad4cc97acb1a18b72b7ff188f31da318a67e7e1c7af45565eb745f9fc318dd1993d23797d5e441a9e859be1014795d941dbf9e3fe013a010d35bf09c86c29f5c2027607cd396654f79e292be500a42e09b68ba9000230bafa52974813af2b9ce1ae36c285f00df2e8ceac505bdf99e437fc2d993294fa4372ee0e8c35358c84dacea0d9d4a86c76b9f8e4ad45a426b9d56303b4031b2508ac895a4c77ded3fd8664d3731326ae67c00f727dae87ab347b0cdf99125ac8e7c7fae5d01180a52c3208043ca3ab10b5e4d0c1e8a4af00fe3603e229cdb8ae40a8c11ad7951b5f3f5f7af16da23336a8bafd061d89a6ba53b1cbe0711438658258df5a14a377c45adf2b48a3157168a8b05a57f02b1c7901151d07cfe201e0879e5e323e409bc1b3781e8a35af0863e5b3721a9832c646bcb0715469f4bf42c17f8e7b244f875394d56d0487d0f066e332299c7c1b8abb3120603be814c8a2f111afe1776b1d3d920258016473b44656f937127504ca7cb068223c64b096753c0cdcdeb8dd382247417d8d38a7f8ab78de67f9b964464045d14dc2fa352aa73b1a4b161518510f0ddbde50d9249cead291f1e45aaf42f689079f8a494b0c7dc327a1e8291ed51e4571b2f374989ecbdcac42c54ea85c8aee11b8be9cd5e97fb9129a454f7d3fd8f2b7bcd84b2b6683287b4218c910e50f674c1a5512720f316dc69ee5ffb6b9588429cebd3daf928aac6d2c93d0496dde5a87293bfd37d0358a2a70f9211a0cf4e655515c40c9f051e0dd33fa50f55cdf7bd107abd1afb3d4495137c45ca123ff8828cc70057131f190ae3c22cf45a696ede4edf0de3a195449e7c8f0988dce24481f6cf76d63468014e0f6b6d52a03e549fb0e7de30e3593e0aa2767409cab054560c76</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好, 这里需要密码才能访问.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">有东西被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="OI" scheme="https://blog.satori-march.top/categories/OI/"/>
    
    <category term="游记" scheme="https://blog.satori-march.top/categories/OI/travelogue/"/>
    
    
    <category term="OI" scheme="https://blog.satori-march.top/tags/OI/"/>
    
    <category term="encrypted" scheme="https://blog.satori-march.top/tags/encrypted/"/>
    
  </entry>
  
  <entry>
    <title>git仓库嵌套导致github actions部署hexo博客失败</title>
    <link href="https://blog.satori-march.top/posts/blog/hexo-action-deploy/"/>
    <id>https://blog.satori-march.top/posts/blog/hexo-action-deploy/</id>
    <published>2022-05-29T20:18:42.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="git-submodule">git submodule</h2><p>按网上的教程配置 github actions, 在 <code>hexo generate</code> 的时候无法解析文章里的 tag plugins(标签插件) 而是会报错. 我一开始还以为是插件没装上, 后来才意识到, 我的主题是直接在 <code>themes</code> 文件夹里 <code>git clone</code> 过来的, actions 中 clone 我的仓库是不包含这个主题的, 所以才报错. git 仓库嵌套使用后, 被嵌套的 git 仓库不能被外层 git 仓库检测到. 百度~~(其实是bing但我说习惯了)~~后发现 git 还有 submodule 这种东西, 刚好可以达到我们的目的.</p><p>首先要用 <code>git rm --cached</code> 删除原来的内层仓库, 不要直接删除, 否则外层可能会感知不到, 然后输入命令:</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git submodule add <span class="literal">-b</span> [<span class="type">branch</span>] [<span class="type">repository_url</span>] [<span class="type">path</span>]</span><br></pre></td></tr></table></figure><p>例如:</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git submodule add <span class="literal">-b</span> master https://github.com/jerryc127/hexo<span class="literal">-theme-butterfly</span>.git themes\butterfly</span><br></pre></td></tr></table></figure><p>正确运行之后除了拉取到的仓库应该还会在根目录多出一个 <code>.gitmodules</code> 文件. 如果出现问题想要删除 submodule 请用 <code>git submodule deinit [path]</code> 命令.</p><p>这之后直接 <code>git clone</code> 实际上并不会拉取到 submodule 中的代码, 应该在 <code>git clone</code> 命令中带上参数 <code>--recurse-submodules</code> 表示递归拉取所有子模块, 或者执行下面的命令:</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git submodule init</span><br><span class="line">git submodule update</span><br></pre></td></tr></table></figure><p>言归正传, 对于 github actions 来说, 如果你用的是 <code>actions/checkout</code>, 只需要在 <code>with</code> 里加一行 <code>submodules: true</code> 或者 <code>submodules: recursive</code> 即可, 否则参照上文如何拉取子模块.</p><h2 id="deploy-repo">deploy repo</h2><p>改完后生成似乎没问题了, 但依然部署不上, 报错:</p><div class="note danger flat"><p>fatal: could not read Username for ‘<a href="https://github.com">https://github.com</a>’</p></div><p>将 <code>_config.yml</code> 中 <code>deploy</code> 的 <code>repo</code> 更换一下就行了(<a href="https://github.com/hexojs/hexo/issues/2778">参见</a>):</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="comment"># repo: https://github.com/[yourgitname]/[yourgitname].github.io.git</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">git@github.com:[yourgitname]/[yourgitname].github.io.git</span></span><br><span class="line">  <span class="attr">branch:</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><p>但在我的win10电脑能部署, github actions 却不行, 或许是 windows 和 Ubuntu linux 的差异吧, 也有可能是别的问题, 不太清楚, <s>反正解决了就行了</s>.</p><h2 id="更新时间错误">更新时间错误</h2><p>因为 <code>git clone</code> 后文件的修改时间实际上是 <code>clone</code> 的时间, 所以没在 <code>front-matter</code> 填写 <code>updated</code> 的文章的更新时间全都是 <code>clone</code> 的时间. 只要把文件的修改时间变为该文件最后 <code>commit</code> 的时间, 在生成之前加一行命令即可:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find <span class="built_in">source</span>/_posts -name <span class="string">&#x27;*.md&#x27;</span> | <span class="keyword">while</span> <span class="built_in">read</span> file; <span class="keyword">do</span> <span class="built_in">touch</span> -d <span class="string">&quot;<span class="subst">$(git log -1 --format=<span class="string">&quot;@%ct&quot;</span> <span class="string">&quot;<span class="variable">$file</span>&quot;</span>)</span>&quot;</span> <span class="string">&quot;<span class="variable">$file</span>&quot;</span>; <span class="keyword">done</span></span><br></pre></td></tr></table></figure><div class="note warning flat"><p>一定要注意, 如果使用的是 <code>actions/checkout</code>, 要加上参数 <code>fetch-depth: 0</code> 来获取所有历史记录</p></div><p>参考链接:<br><a href="https://mrseawave.github.io/blogs/articles/2021/01/07/ci-hexo-update-time/">修复 CI 构建博客造成的更新时间错误</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;git-submodule&quot;&gt;git submodule&lt;/h2&gt;
&lt;p&gt;按网上的教程配置 github actions, 在 &lt;code&gt;hexo generate&lt;/code&gt; 的时候无法解析文章里的 tag plugins(标签插件) 而是会报错. 我一开始</summary>
      
    
    
    
    <category term="博客" scheme="https://blog.satori-march.top/categories/blog/"/>
    
    
    <category term="Git" scheme="https://blog.satori-march.top/tags/Git/"/>
    
    <category term="Github" scheme="https://blog.satori-march.top/tags/Github/"/>
    
    <category term="hexo" scheme="https://blog.satori-march.top/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>.NET5以上WPF发布单个文件</title>
    <link href="https://blog.satori-march.top/posts/dotnet/single-file-deploy/"/>
    <id>https://blog.satori-march.top/posts/dotnet/single-file-deploy/</id>
    <published>2022-05-22T01:08:43.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="嵌入native-libraries">嵌入native libraries</h2><p>最近要把WPF项目发布成含运行时(部署模式选择&quot;独立&quot;)的单个exe, 想当然的在发布选项里勾选了&quot;生成单个文件&quot;, 却仍生成了若干dll, 而且删除便无法运行, 似乎是native dlls. 搜索资料发现还需要在发布配置文件(<code>Properties\PublishProfiles\*.pubxml</code>)中加入一行代码:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">IncludeNativeLibrariesForSelfExtract</span>&gt;</span>true<span class="tag">&lt;/<span class="name">IncludeNativeLibrariesForSelfExtract</span>&gt;</span></span><br></pre></td></tr></table></figure><p>加入后, 运行程序时会先提取出本地库到目录, 某种意义上不算真正的单文件</p><p>详情见此 -&gt; <a href="https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file/overview#output-differences-from-net-3x">微软官方文档</a></p><p>勾选生成单个文件已经在开头提过了, 后文再补充一些我能想到的其他未能生成单个文件的原因</p><h2 id="更改文件保存方式">更改文件保存方式</h2><p>请在属性选项卡中将图片等文件的&quot;生成操作&quot;(build action)设置为 <code>资源</code>, &quot;复制到输出目录&quot;设置为 <code>不复制</code>, 代码中以路径或Pack URI来使用资源, <s>也可以用反射读取嵌入的资源</s></p><p>一些文本数值或者其他对象可以用 <code>.resx</code>, <code>.settings</code>, 或者自行实现序列化存到 <code>Appdata\Local</code> 或者参见<a href="https://docs.microsoft.com/en-us/dotnet/core/extensions/configuration">Configuration</a> 等各种方式来存储</p><h2 id="更改-pdb-生成选项">更改<code>.pdb</code> 生成选项</h2><p>在项目设置中找到&quot;调试符号&quot;, 选择&quot;未发出任何符号&quot;或者&quot;嵌入到Dll/exe&quot;<br>选择前者会导致无法Debug以及 <code>StackTrace</code> 无法输出异常的文件位置和行号, 因此不推荐使用</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;嵌入native-libraries&quot;&gt;嵌入native libraries&lt;/h2&gt;
&lt;p&gt;最近要把WPF项目发布成含运行时(部署模式选择&amp;quot;独立&amp;quot;)的单个exe, 想当然的在发布选项里勾选了&amp;quot;生成单个文件&amp;quot;, 却仍生成了若</summary>
      
    
    
    
    <category term=".NET" scheme="https://blog.satori-march.top/categories/dotnet/"/>
    
    
    <category term="c#" scheme="https://blog.satori-march.top/tags/csharp/"/>
    
    <category term="WPF" scheme="https://blog.satori-march.top/tags/WPF/"/>
    
    <category term=".NET" scheme="https://blog.satori-march.top/tags/dotnet/"/>
    
  </entry>
  
  <entry>
    <title>[游记] TJOI 2022</title>
    <link href="https://blog.satori-march.top/posts/OI/travelogue/TJOI2022/"/>
    <id>https://blog.satori-march.top/posts/OI/travelogue/TJOI2022/</id>
    <published>2022-04-12T00:00:00.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<p>小道消息听说因为疫情原因省选取消了, 哈哈…</p><p>原地退役</p><hr><p>接到正式通知取消了，寄了</p>]]></content>
    
    
    <summary type="html">没能去成的最后一次OI比赛</summary>
    
    
    
    <category term="OI" scheme="https://blog.satori-march.top/categories/OI/"/>
    
    <category term="游记" scheme="https://blog.satori-march.top/categories/travelogue/"/>
    
    
    <category term="OI" scheme="https://blog.satori-march.top/tags/OI/"/>
    
  </entry>
  
  <entry>
    <title>C#基础教程[5] 方法</title>
    <link href="https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[5]%E6%96%B9%E6%B3%95/"/>
    <id>https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[5]%E6%96%B9%E6%B3%95/</id>
    <published>2022-02-03T00:00:00.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="方法的定义">方法的定义</h2><div class="note info flat"><p>在本节之前为了便于理解故将方法称为函数, 本节之后为了与专有名词接轨所以使用方法一词</p></div><p>我们已经用过很多内置的方法了, 例如 <code>WriteLine()</code>, <code>ToInt32()</code>, <code>Max()</code> 等等, 其实我们也可以定义方法, 定义方法的语法如下:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[访问修饰符] 返回值类型 方法名([参数列表])</span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">//方法体</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>让我们以下面这个方法为例, 分析一下定义方法的语法的含义</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="built_in">int</span> <span class="title">Square</span>(<span class="params"><span class="built_in">int</span> a</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">return</span> a * a;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这个方法接收一个 <code>int</code> 类型的参数并记为 <code>a</code>, 然后返回 <code>a</code> 的平方</p><ul><li><p><code>public</code> 是访问修饰符, 除此之外还有 <code>private</code>, <code>protected</code> 等. 如无特殊说明, 本文中所有的访问修饰符更改都不会影响结果, 先不用在意</p></li><li><p>其中第一个 <code>int</code> 表示的是方法的返回值的类型, 括号里的第一个(也是唯一一个) <code>int</code> 表示接收的第一个参数是 <code>int</code> 类型的, 将这个参数记为 <code>a</code>, 可以在方法体里用 <code>a</code> 来使用</p></li><li><p>方法体就是调用这个方法之后执行的代码片段</p></li><li><p><code>return</code> 关键字表示将后面的值作为方法的返回值, <strong>然后立刻结束该方法</strong></p></li></ul><p>我们需要把这个方法的定义写在 <code>Main</code> 方法外面, 让我们试着像调用 <code>Max()</code> 方法那样调用它:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="built_in">int</span> <span class="title">Square</span>(<span class="params"><span class="built_in">int</span> a</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> a * a;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        Console.WriteLine(Square(<span class="number">5</span>));</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后会发现报错了:</p><div class="note danger flat"><p>对象引用对于非静态的字段、方法或属性“Program.square(int)”是必需的</p></div><p>这句话大家可能看着云里雾里的, 但是也许大概能猜出两点:</p><ol><li>对于<emp>非静态</emp>的xxx是必须的, 那如果是静态的就非必须了?</li><li>似乎缺少一个对象?</li></ol><p>对于第一种想法只要在方法的定义里加上 <code>static</code> 修饰符就可以了(<code>static</code> 这个词就是&quot;静态&quot;的意思):</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">int</span> <span class="title">square</span>(<span class="params"><span class="built_in">int</span> a</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> a * a;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        Console.WriteLine(square(<span class="number">5</span>));</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>现在就可以正常运行了, 加上 <code>static</code> 修饰符的方法叫做静态方法</p><p>我们在第三节&quot;再谈类型&quot;详细讲过什么是&quot;静态&quot;, 当时是这么说的:</p><blockquote><p>静态是一种总体的概念，与整个类有关，和每个单独的对象没有关系。</p></blockquote><p>大家还记得 <code>Program</code> 也是一个类吗, 这里的类指的就是 <code>Program</code> 类, 这个方法的返回值只与它接受的参数有关系, 与其他的东西没有关系, 所以可以设定为静态的。</p><p>第二种做法需要自己定义一个类</p><p>还记得当时我们是怎么使用 <code>Random</code> 类中的 <code>Next()</code> 方法的吗? <code>Random</code> 是一个类, 我们先 <code>new</code> 了一个 <code>Random</code> 类的对象称作 <code>rd</code>, 然后再用 <code>.</code> 调用 <code>rd</code> 对象的方法 <code>Next()</code></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Random rd = <span class="keyword">new</span> Random();</span><br><span class="line"><span class="built_in">int</span> a = rd.Next();</span><br></pre></td></tr></table></figure><p>仿照我们代码中的 <code>Program</code> 类, 再定义一个类: (具体有关类的概念会在下一节讲解)</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title">Calculator</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="built_in">int</span> <span class="title">Square</span>(<span class="params"><span class="built_in">int</span> a</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> a * a;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后把这个类和 <code>Program</code> 类并列放在一起, 再用类似的做法调用 <code>Square</code> 方法:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">csharp</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            Calculator cal = <span class="keyword">new</span> Calculator();</span><br><span class="line">            Console.WriteLine(cal.square(<span class="number">5</span>));</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">class</span> <span class="title">Calculator</span>  <span class="comment">// Calculator类的定义从这开始</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="built_in">int</span> <span class="title">square</span>(<span class="params"><span class="built_in">int</span> a</span>)  <span class="comment">// 必须使用public</span></span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> a * a;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这种没有 <code>static</code> 修饰符的方法叫做非静态方法或者实例方法</p><p>因为 <code>square</code> 的结果只与参数 <code>a</code> 有关所以其实在 <code>Calculator</code> 类中也可以使用静态方法:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">csharp</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">// 不需要new一个Calculator</span></span><br><span class="line">            <span class="built_in">int</span> a = Calculator.Square(<span class="number">5</span>); </span><br><span class="line">            Console.WriteLine(a);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">class</span> <span class="title">Calculator</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">int</span> <span class="title">Square</span>(<span class="params"><span class="built_in">int</span> a</span>)  <span class="comment">// 必须使用public</span></span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> a * a;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>后文均使用静态方法, 但所述内容对实例方法也适用, 而实例方法会在下一节介绍面向对象相关内容用到</p><h3 id="void-关键字">void 关键字</h3><p>方法并不一定要有返回值, 如果想要定义一个没有返回值的方法可以使用 <code>void</code> 关键字代替原来的返回值类型的位置:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Output</span>(<span class="params"><span class="built_in">string</span> name</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;My name is&quot;</span> + name);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后正常调用:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Output</span>(<span class="params"><span class="built_in">string</span> name</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;My name is &quot;</span> + name);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    Output(<span class="string">&quot;jiangdu&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>无返回值方法也可以用 <code>return;</code> 来让方法立刻结束:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Output</span>(<span class="params"><span class="built_in">string</span> name</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (name == <span class="string">&quot;jiangdu&quot;</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;My name is &quot;</span> + name);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    Output(<span class="string">&quot;jiangdu&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>上面的代码没有输出</p><h2 id="方法的参数">方法的参数</h2><p>方法的参数可以是任意类型, 也可以有多个参数</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">double</span> <span class="title">Max</span>(<span class="params"><span class="built_in">double</span> a, <span class="built_in">double</span> b</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (a &gt;= b) <span class="keyword">return</span> a;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">return</span> b; </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意多个参数的时候参数的类型可以不同, 但是一定要注意输入的顺序:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Info 常用来表示 Infomation 的缩写</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">PrintInfo</span>(<span class="params"><span class="built_in">string</span> name, <span class="built_in">int</span> index</span>)</span> </span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (index &lt;= <span class="number">0</span>) &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;序号无效&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span>&#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;第&#123;0&#125;个学生: &#123;1&#125;&quot;</span>, index, name);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>调用的时候需要按照参数列表的顺序来:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    PrintInfo(<span class="string">&quot;jiangdu&quot;</span>, <span class="number">1</span>);  <span class="comment">// 正确</span></span><br><span class="line">    PrintInfo(<span class="number">1</span>, <span class="string">&quot;jiangdu&quot;</span>);  <span class="comment">// 报错</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="例题5-1-遍历查找">例题5-1 遍历查找</h3><p>给定一个一维数组, 返回数组中的最大值</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">static</span> <span class="built_in">int</span> <span class="title">GetMax</span>(<span class="params"><span class="built_in">int</span>[] array</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">int</span> max = array[<span class="number">0</span>];</span><br><span class="line">    <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">1</span>; i &lt; array.Length; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (array[i] &gt; max)</span><br><span class="line">            max = array[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> max;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用随机数来测试你的代码:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">int</span> n = <span class="number">10</span>;</span><br><span class="line">    <span class="built_in">int</span>[] a = <span class="keyword">new</span> <span class="built_in">int</span>[n];  <span class="comment">// 开一个大小为 10 的一维数组, 下标范围[0,9]</span></span><br><span class="line">    Random rd = <span class="keyword">new</span> Random();  <span class="comment">// Random对象不需要每次重新生成, 所以放在循环外面</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        a[i] = rd.Next(<span class="number">0</span>, <span class="number">101</span>);  <span class="comment">// 左闭右开</span></span><br><span class="line">        Console.Write(a[i] + <span class="string">&quot; &quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Console.Write(<span class="string">&quot;\n&quot;</span>);  <span class="comment">// 双引号中的 \n 表示换行符</span></span><br><span class="line">    <span class="comment">// Console.WriteLine();  // 这样也可以直接输出换行</span></span><br><span class="line">    Console.WriteLine(GetMax(a));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="引用传递参数">引用传递参数</h3><p>在解释这段的标题前先思考一下, 如何交换两个整数呢? 是<code>x = y; y = x;</code> 吗, 显然不是, 因为在 <code>x = y;</code> 之后, <code>x</code> 保存的就是 <code>y</code> 的值了, 所以 <code>y = x;</code> 之后两个变量保存的都是原来 <code>y</code> 的值</p><p>所以应该用一个变量临时存储一下原来 <code>x</code> 的值:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> temp = x;  <span class="comment">// 把 x 的值保存到 temp</span></span><br><span class="line">x = y;  <span class="comment">// 把 y 的值保存到 x</span></span><br><span class="line">y = temp;  <span class="comment">// 把 temp 的值(即交换前 x 的值)保存到 y</span></span><br></pre></td></tr></table></figure><div class="note info flat"><p>temp 是 temporary 的缩写, 意思是&quot;临时的&quot;</p></div><p>让我们试着写一个交换两个整数的方法(有BUG):</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Swap</span>(<span class="params"><span class="built_in">int</span> x, <span class="built_in">int</span> y</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">int</span> temp = x;</span><br><span class="line">    x = y;</span><br><span class="line">    y = temp;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在主函数中调用这个方法, 然后运行一下</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">int</span> a = <span class="number">5</span>, b = <span class="number">10</span>;</span><br><span class="line">    Swap(a, b);</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;&#123;0&#125; &#123;1&#125;&quot;</span>, a, b);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>你会发现两个数并没有完成交换, 这就是因为我们传入参数的时候是按值传递的参数</p><p>在你传递参数的时候, 传递的只是 <code>a</code> 变量的值 <code>5</code> 和 <code>b</code> 变量的值 <code>10</code>, 在调用的时候把这两个值复制了一遍, 和原来的变量没有关系, 我们只交换了那两个复制之后的值, 而没有交换原来的值(复制出来的值会在方法运行结束后销毁)</p><p>这样的设计是为了保护原本的参数不变</p><p>方法的参数列表中的 <code>x</code> 和 <code>y</code> 称为形式参数, 简称形参, 是出现在方法的定义中用来代表传入的值的; 而具体调用时的参数 <code>a</code> 和 <code>b</code> 称为实际参数, 简称实参, 出现在调用方法的时候</p><p>为了实现 <code>Swap</code> 方法, 就要用到引用</p><blockquote><p>引用参数是一个对变量的内存位置的引用。当按引用传递参数时，与值参数不同的是，它不会为这些参数创建一个新的存储位置。引用参数表示与提供给方法的实际参数具有相同的内存位置。</p></blockquote><p>如果把变量比作房子, 引用就像是房子的地址, 如果传入的参数是变量的地址的话, 那在方法里也可以按照这个地址找到原来的变量. 所以按引用传参的话, 在方法里也能更改原本的变量</p><p>使用 <code>ref</code> 关键字来声明引用参数:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Swap</span>(<span class="params"><span class="keyword">ref</span> <span class="built_in">int</span> x, <span class="keyword">ref</span> <span class="built_in">int</span> y</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">int</span> temp = x;</span><br><span class="line">    x = y;</span><br><span class="line">    y = temp;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>现在再测试, 就可以正常执行了</p><h2 id="递归">递归</h2><p>从刚刚在方法里调用 <code>WriteLine()</code> 方法以及 <code>Main</code> 方法能够调用其他方法就能看出, 方法之间是可以互相调用的. 那么, 一个方法能不能调用自身呢? 答案是肯定的, 不过先不要急着写出像下面这样的代码:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Function</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">    Function();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果你试着调用它然后运行, 过几秒或更久之后就会有这样的报错:</p><div class="note danger flat"><p>发生异常: CLR/System.StackOverflowException</p></div><p>由于 <code>Function</code> 方法一直在调用自身, 而内层的方法返回之前外层的 <code>Function</code> 方法不会结束, 而内层的方法又会再次调用 <code>Function</code>, 然后无限重复.</p><p>这就有点像大家从小就听过的故事：从前有座山，山里有座庙，庙里有一个老和尚和一个小和尚讲故事。从前有座山，山里有座庙，庙里有一个老和尚和一个小和尚讲故事…</p><p>关注刚刚报错信息中的 <code>StackOverflow</code> 这个词, <code>Stack</code> 是栈的意思, 这里指的是调用栈, 你可以理解为是一种只能从上方放东西或者取东西的容器, 每当方法调用的时候就会往里装东西, 例如按值传递的时候会把复制之后的值放在这里; 当方法返回的时候就会把对应的东西拿出来扔掉</p><p><code>StackOverflow</code> 就是栈溢出,  因为那个方法一直在无限重复调用自身, 而每次调用都会往栈里装东西, 但没有方法返回所以不会取出任何东西, 最后装满了放不下了, 然后你的程序就崩溃了.</p><p>因此我们需要给调用自身一个终止条件:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 递归的英文是 Recursion</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Recursion</span>(<span class="params"><span class="built_in">int</span> n</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (n == <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Recursion(n<span class="number">-1</span>);</span><br><span class="line">    Console.WriteLine(n);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>()</span></span><br><span class="line">&#123;</span><br><span class="line">    Recursion(<span class="number">5</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>输出是:</p><div class="note default flat"><p>0<br>1<br>2<br>3<br>4<br>5</p></div><p>调用过程类似 Recursion(5) -&gt; Recursion(5) -&gt; … -&gt; Recursion(0) 由于到了 <code>n == 0</code> 的时候不再调用自身, 所以 最内层的 <code>Recursion(0)</code> 输出之后可以返回, 之后次内层的 <code>Recursion(1)</code> 就可以输出并返回了…最终 <code>Recursion(5)</code> 可以正常结束</p><p>这样方法自己调用自己的技巧就叫做递归</p><p>关于递归有很多笑话: 要理解递归，就得先了解什么是递归。</p><p>实际上这句话就是一个递归。<br>了解递归(1) -&gt; 了解递归(2) -&gt; …<br>当你从这句话中悟出什么是递归的时候, 就可以一层层返回了</p><p>注意刚刚代码中的 <code>Recursion(n-1);</code> 和 <code>Console.WriteLine(n);</code> 的顺序, 如果颠倒一下输出就会完全相反</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Recursion</span>(<span class="params"><span class="built_in">int</span> n</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (n == <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Console.WriteLine(n);</span><br><span class="line">    Recursion(n - <span class="number">1</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>因为 <code>Recursion(i)</code> 会先输出自己的 <code>n</code> 的值再调用 <code>Recursion(i - 1)</code>, 所以输出会先从 <code>5</code> 开始, <code>0</code> 结束</p><h3 id="例题5-2-斐波那契数列">例题5-2 斐波那契数列</h3><p>斐波那契数列的定义:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo fence="true">{</mo><mtable rowspacing="0.16em" columnalign="left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo>+</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo>−</mo><mn>2</mn><mo stretchy="false">)</mo><mo separator="true">,</mo><mi>n</mi><mo>≥</mo><mn>3</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>f</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn></mrow></mstyle></mtd></mtr></mtable></mrow><annotation encoding="application/x-tex">\left\{ \begin{array} { l } { f ( n ) = f ( n - 1 ) + f ( n - 2 ), n \ge 3 } \\ { f ( 1 ) = f(2) = 1 } \end{array} \right.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.4em;vertical-align:-0.95em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">{</span></span><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">3</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>也就是: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55…</p><p>输出斐波那契数列的第 <code>x</code> 个数</p><p>递归代码:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">int</span> <span class="title">Fib</span>(<span class="params"><span class="built_in">int</span> n</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (n == <span class="number">1</span> || n == <span class="number">2</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> Fib(n - <span class="number">1</span>) + Fib(n - <span class="number">2</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>由此可见, 数学上的递推公式可以直观的用递归写出来, 很多算法也都是用递归来实现的, 例如dfs</p><p>递归时调用的过程是这样的:</p><p><img src="https://s6.jpg.cm/2022/02/07/LoqS32.png" alt="recursion"></p><p>注意到这张图里 <code>Fib(3)</code> 以及它下面会调用的方法这个整体会被计算两遍, 因此刚刚的递归会产生大量重复运算, 而使用下文展示的循环对于每个 <code>fib(i)</code> 则只会计算一次, 所以这里用循环会比刚刚那种递归要快很多:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> n = <span class="number">10</span>;</span><br><span class="line"><span class="built_in">int</span>[] fib = <span class="keyword">new</span> <span class="built_in">int</span>[n + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">fib[<span class="number">1</span>] = fib[<span class="number">2</span>] = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="built_in">int</span> i = <span class="number">3</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    fib[i] = fib[i - <span class="number">1</span>] + fib[i - <span class="number">2</span>];</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(fib[n]);</span><br></pre></td></tr></table></figure><p>甚至还可以用技巧来省去数组, 节约内存:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> n = <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"><span class="built_in">int</span> first = <span class="number">1</span>, second = <span class="number">1</span>, third = <span class="number">2</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="built_in">int</span> i = <span class="number">3</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    third = first + second;</span><br><span class="line">    first = second;</span><br><span class="line">    second = third;</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(third);</span><br></pre></td></tr></table></figure><p>不过很多更复杂的情况下递归容易写出, 而循环可能非常难写</p><p>在 <code>n</code> 的取值大到能体会到速度差别之前就会因为 <code>fib[n]</code> 太大超过 <code>int</code> 的表示范围而输出错误的结果, 如果想测试两段代码的速度的话, 请在过程中对答案取模, 例如:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">DateTime startTime = DateTime.Now;  <span class="comment">// 保存当前时间</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">int</span> n = <span class="number">10</span>;</span><br><span class="line"><span class="built_in">int</span> mod = <span class="number">1000000000</span>;</span><br><span class="line"></span><br><span class="line"><span class="built_in">int</span> first = <span class="number">1</span>, second = <span class="number">1</span>, third = <span class="number">2</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="built_in">int</span> i = <span class="number">3</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    third = (first + second) % mod;  <span class="comment">// 在这里取模</span></span><br><span class="line">    first = second;</span><br><span class="line">    second = third;</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(third);</span><br><span class="line"></span><br><span class="line">DateTime finishTime = DateTime.Now;  <span class="comment">// 保存当前时间</span></span><br><span class="line"><span class="built_in">double</span> deltaTime = (finishTime - startTime).TotalMilliseconds;  <span class="comment">// 计算时间差</span></span><br><span class="line"></span><br><span class="line">Console.WriteLine(<span class="string">&quot;use &#123;0&#125; ms&quot;</span>, deltaTime);</span><br></pre></td></tr></table></figure><p>递归也可以改写为只计算一次的</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">int</span> <span class="title">Fib</span>(<span class="params"><span class="built_in">int</span> n, <span class="built_in">int</span>[] fib</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (n == <span class="number">1</span> || n == <span class="number">2</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (fib[n] != <span class="number">0</span>) <span class="keyword">return</span> fib[n];</span><br><span class="line">    fib[n] = Fib(n - <span class="number">1</span>, fib) + Fib(n - <span class="number">2</span>, fib);</span><br><span class="line">    <span class="keyword">return</span> fib[n];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">int</span> n = <span class="number">40</span>;</span><br><span class="line">    <span class="built_in">int</span>[] fib = <span class="keyword">new</span> <span class="built_in">int</span>[n + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">    Console.WriteLine(Fib(n, fib));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这样借助 <code>fib</code> 数组将递归已经计算过的结果存储下来, 避免重复运算, 称为记忆化搜索</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;方法的定义&quot;&gt;方法的定义&lt;/h2&gt;
&lt;div class=&quot;note info flat&quot;&gt;&lt;p&gt;在本节之前为了便于理解故将方法称为函数, 本节之后为了与专有名词接轨所以使用方法一词&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;我们已经用过很多内置的方法了, 例如 &lt;code&gt;W</summary>
      
    
    
    
    <category term="c#" scheme="https://blog.satori-march.top/categories/csharp/"/>
    
    <category term="电子电路社" scheme="https://blog.satori-march.top/categories/%E7%94%B5%E5%AD%90%E7%94%B5%E8%B7%AF%E7%A4%BE/"/>
    
    <category term="c#教程" scheme="https://blog.satori-march.top/categories/csharp/charp-tutorial/"/>
    
    
    <category term="c#" scheme="https://blog.satori-march.top/tags/csharp/"/>
    
  </entry>
  
  <entry>
    <title>C#基础教程[4] 数组</title>
    <link href="https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[4]%E6%95%B0%E7%BB%84/"/>
    <id>https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[4]%E6%95%B0%E7%BB%84/</id>
    <published>2022-01-16T00:00:00.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="声明数组">声明数组</h2><p>数组是一个存储相同类型数据的固定大小的顺序集合。用简单的话来说就是，数组可以用单个变量名来访问很多同一类型的数据，而不需要声明很多的变量。</p><p>假设我们正在做一个把所有一共 <code>n</code> 个学生的分数进行排名的程序，那么我们就要储存所有学生的分数，由于 <code>n</code> 可能很大而且不是一个固定的值，所以我们无法为每个学生都声明一个变量来存储，就算那么做也无法进行排名。这时候我们需要使用数组。</p><p>声明数组的语法如下：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">type[] arrayName;  <span class="comment">// array 就是数组的英文</span></span><br></pre></td></tr></table></figure><p>例如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores;</span><br></pre></td></tr></table></figure><p>但如果这样使用数组的话会报错：</p><div class="note danger flat"><p>error CS0165: 使用了未赋值的局部变量“score”</p></div><p>这是因为数组声明之后并不会初始化，所以还需要在声明的时候使用 <code>new</code> 关键字来创建数组的实例（关于什么是 <code>new</code> 操作符请见上一篇教程 不过暂时不懂问题也不大），例如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>];</span><br></pre></td></tr></table></figure><p>其中方括号里的数组表示的是数组的大小，也就是数组中元素的个数。数组的长度是固定的，所以必须说明它的大小。</p><div class="note info flat"><p>你可以声明任意类型的数组, 比如 <code>double</code>, <code>string</code> 等, 还有更复杂的还没学到的, 现在只用 <code>int</code> 举例</p></div><p>在定义数组之后，我们可以用 <code>arrayName[index]</code> 来访问叫做 <code>arrayName</code> 的数组中的第 <code>index+1</code> 个元素，其中方括号中的内容叫做数组的下标或者索引(index就是索引的英文)。</p><div class="note danger flat"><p>请注意，数组是从 0 开始计数的，所以数组中的第一个元素应为 <code>arrayName[0]</code> 而非 <code>arrayName[1]</code></p></div><p>你可以在声明的时候对数组中的元素赋初始值，例如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>] &#123; <span class="number">98</span>, <span class="number">97</span>, <span class="number">94</span>, <span class="number">92</span>, <span class="number">95</span> &#125;;</span><br></pre></td></tr></table></figure><p>此时 <code>scores</code> 数组中第一个元素是 98, 索引是 0, 最后一个元素是95, 索引是 4</p><p>使用 <code>scores[index]</code> 访问数组中的元素:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>] &#123; <span class="number">98</span>, <span class="number">97</span>, <span class="number">94</span>, <span class="number">92</span>, <span class="number">95</span> &#125;;</span><br><span class="line">Console.WriteLine(scores[<span class="number">1</span>]);</span><br></pre></td></tr></table></figure><p>输出为 97 (注意不是 98, 因为数组从 0 开始计数)</p><p>可以这样来更改数组中的元素:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>] &#123; <span class="number">98</span>, <span class="number">97</span>, <span class="number">94</span>, <span class="number">92</span>, <span class="number">95</span> &#125;;</span><br><span class="line">scores[<span class="number">1</span>] = <span class="number">99</span>;</span><br><span class="line">Console.WriteLine(scores[<span class="number">1</span>]);  <span class="comment">// 输出 99</span></span><br></pre></td></tr></table></figure><div class="note danger flat"><p>请时刻留意数组的范围, 因为数组从 0 开始</p></div><p>如果你试图访问不存在的下标, 例如:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>];</span><br><span class="line">scores[<span class="number">5</span>] = <span class="number">1</span>;</span><br></pre></td></tr></table></figure><p>会收到这样的报错信息:</p><div class="note danger flat"><p>Index was outside the bounds of the array.</p></div><p>翻译过来就是: 下标超过了数组的边界, 也就是&quot;数组越界&quot;, 因为数组的 下标从 0 开始, 而这个数组只有 5 个元素, 所以下标范围是[0, 4], 故发生了数组越界.</p><h2 id="遍历数组">遍历数组</h2><p>为了一次性访问数组中的诸多元素, 可以使用第二节学过的循环:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>] &#123; <span class="number">98</span>, <span class="number">97</span>, <span class="number">94</span>, <span class="number">92</span>, <span class="number">95</span> &#125;;</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; <span class="number">5</span>; i++) &#123;  <span class="comment">// 注意这里的条件</span></span><br><span class="line">    Console.WriteLine(scores[i]);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>输出估计大家都能猜到：</p><details class="toggle" ><summary class="toggle-button" style="">查看输出</summary><div class="toggle-content"><p>98<br>97<br>94<br>92<br>95</p></div></details><p>也可以试试用循环进行初始化</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>];</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; <span class="number">5</span>; i++) &#123;  <span class="comment">// 注意这里的条件</span></span><br><span class="line">    scores[i] = i;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当你不知道数组有多大的时候，可以使用 <code>arrayName.Length</code> 访问数组的长度，上面的代码可以写为：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>] &#123; <span class="number">98</span>, <span class="number">97</span>, <span class="number">94</span>, <span class="number">92</span>, <span class="number">95</span> &#125;;</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; scores.Length; i++) &#123;  <span class="comment">// 注意这里的条件</span></span><br><span class="line">scores[i] = i;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意 <code>Length</code> 后面不要写括号，因为这不是个函数，而是一个属性</p><p>为了方便起见, 你也可以不用索引为 0 的元素, 比如要存 5 个元素的时候写为这样:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">6</span>];</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">1</span>; i &lt;= <span class="number">5</span>; i++) &#123;</span><br><span class="line">    scores[i] = i;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><div class="note danger flat"><p>如果这么用的话请一定要注意给数组多分配一个长度, 因为第 0 个被空出来了<br>以及注意 <code>for</code> 循环时一定要循环到 <code>&lt;= arrayName.Length - 1</code> 这样才能遍历全部元素</p></div><h3 id="foreach-语句"><code>foreach</code> 语句</h3><p>其实我们有更简单的循环的语句，之前在讲循环的时候因为没学数组所以没讲，就是使用 <code>foreach</code> 语句</p><p>类似 <code>python</code> 中的 <code>for item in array:</code>，你可以直接用 <code>foreach</code> 来访问数组中的每一个值，例如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>] &#123; <span class="number">98</span>, <span class="number">97</span>, <span class="number">94</span>, <span class="number">92</span>, <span class="number">95</span> &#125;;</span><br><span class="line"><span class="keyword">foreach</span> (<span class="built_in">int</span> i <span class="keyword">in</span> scores) &#123;</span><br><span class="line">    Console.WriteLine(i);              </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>i</code> 本身代表数组中的一个元素，而不是索引，所以应该直接输出 <code>i</code></p><p>请注意 <code>foreach</code> 语句中的 <code>i</code> 是不能被赋值的, 也就是说只能用 <code>foreach</code> 来查询数组中的值而不能用来赋值</p><h3 id="例题-4-1-最高分">例题 4-1 最高分</h3><p>求所有学生中的最高分数</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>] &#123; <span class="number">98</span>, <span class="number">97</span>, <span class="number">94</span>, <span class="number">92</span>, <span class="number">95</span> &#125;;</span><br><span class="line"><span class="built_in">int</span> maxScore = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">foreach</span> (<span class="built_in">int</span> item <span class="keyword">in</span> scores) &#123;</span><br><span class="line">    maxScore = Math.Max(item, maxScore);</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(maxScore);</span><br></pre></td></tr></table></figure><p>其中 <code>Math.Max()</code> 是一个我们之前没有用过的函数, 不过顾名思义, 就是返回两个数中的最大值（<code>double</code> 等数据类型也是可以的）</p><p>如果你不愿意使用这个函数, 可以改为：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>] &#123; <span class="number">98</span>, <span class="number">97</span>, <span class="number">94</span>, <span class="number">92</span>, <span class="number">95</span> &#125;;</span><br><span class="line"><span class="built_in">int</span> maxScore = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">foreach</span> (<span class="built_in">int</span> item <span class="keyword">in</span> scores) &#123;</span><br><span class="line">    <span class="keyword">if</span> (maxScore &lt; item) maxScore = item;</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(maxScore);</span><br></pre></td></tr></table></figure><p>也就是说只在 <code>maxScore</code> 比 <code>item</code> 小的时候才用 <code>item</code> 更新 <code>maxScore</code>, 这样 <code>maxScore</code> 就是 <code>scores</code> 数组中的最大值了</p><p>那么回到本文最开始的问题, 怎么给 <code>n</code> 个学生的分数进行排名呢, 不用想怎么实现排序, 因为 <code>c#</code> 有给数组排序的函数: <code>Array.Sort(arrayName)</code><br>这里的 <code>Array</code> 是一个类, 包含很多与数组有关的函数</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">5</span>] &#123; <span class="number">98</span>, <span class="number">97</span>, <span class="number">94</span>, <span class="number">92</span>, <span class="number">95</span> &#125;;</span><br><span class="line">Array.Sort(scores);</span><br></pre></td></tr></table></figure><p>这样就给 <code>scores</code> 数组排好序了, <code>sort</code> 排序默认是从小到大, 所以我们可以反着遍历数组来输出从大到小的值</p><p>完成了最初的目标, 再改为需要读入数据的版本：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> n = Convert.ToInt32(Console.ReadLine());  <span class="comment">// 学生总数</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[n];</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">    scores[i] = Convert.ToInt32(Console.ReadLine());  <span class="comment">// 每个学生的分数</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Array.Sort(scores);</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = n - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">    Console.WriteLine(scores[i]);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果你嫌倒着遍历麻烦可以使用 <code>Array.Reverse()</code> 来翻转数组, 这样就能正着遍历了:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 前面的代码相同, 略去</span></span><br><span class="line">Array.Sort(scores);</span><br><span class="line">Array.Reverse(scores);</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">    Console.WriteLine(scores[i]);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><div class="note warning flat"><p>注意, 如果你要把第一个空过去的话不能直接 <code>Array.Sort(arrayName)</code>, 因为这样会把第 0 个元素 <code>0</code> 也算进去排序</p></div><p><code>Sort</code> 有很多重载, 其中一个是 <code>Sort(arrayName, index, length)</code> , <code>index</code> 是排序范围的起始索引, <code>length</code> 是排序的元素个数<br><code>Reverse</code> 也有类似的用法</p><p>所以要空过去第 0 个的话, 应该改为:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> n = Convert.ToInt32(Console.ReadLine());  <span class="comment">// 学生总数</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[n+<span class="number">1</span>];  <span class="comment">// 因为后面空过去了第 0 个元素所以这里要声明为 n+1, 否则会数组越界</span></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    scores[i] = Convert.ToInt32(Console.ReadLine());</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Array.Sort(scores, <span class="number">1</span>, n);</span><br><span class="line">Array.Reverse(scores, <span class="number">1</span>, n);</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    Console.WriteLine(scores[i]);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>再加点细节:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">Console.Write(<span class="string">&quot;请输入学生总数: &quot;</span>);</span><br><span class="line"><span class="built_in">int</span> n = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"></span><br><span class="line"><span class="built_in">int</span>[] scores = <span class="keyword">new</span> <span class="built_in">int</span>[n+<span class="number">1</span>]; </span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    Console.Write(<span class="string">&quot;请输入第&#123; 0 &#125;个学生的分数: &quot;</span>, i);</span><br><span class="line">    scores[i] = Convert.ToInt32(Console.ReadLine());</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Array.Sort(scores, <span class="number">1</span>, n);</span><br><span class="line">Array.Reverse(scores, <span class="number">1</span>, n);</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;第&#123; 0 &#125;名的分数: &#123; 1 &#125;&quot;</span>, i, scores[i]);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="扩展阅读">扩展阅读</h3><div class="note info flat"><p>本段可以跳过</p></div><p>你会发现，这样我们只对分数进行了排序，而没法将分数与人名对应, 做法有很多种, 这里只介绍其中一种</p><p>可以想到, 我们需要的是一个 能够同时保存 <code>int</code> 类型的数和 <code>string</code> 类型的字符串的类型, 再定义这个类型的数组(之前说过可以声明更复杂类型的数组), 再用 <code>Sort</code> 对它进行排序, 而我们还没学过自定义类型, 怎么办呢</p><p>好在 <code>c#4.0</code> 提供了 <code>Tuple</code> 类型(中文为元组), 可以由多个元素组成(最多8个), 用 <code>tupleName.Item1</code> 访问第一个元素(以此类推)</p><p>用 <code>Tuple&lt;int, string&gt;</code> 来表示第一个元素为 <code>int</code> 类型, 第二个元素为 <code>string</code> 类型的 <code>Tuple</code></p><p>所以我们创建一个 <code>Tuple&lt;int, string&gt;</code> 类型的数组<br><code>Tuple</code> 类型已经写好了 <code>&lt;</code> 操作符, 先比较第一个元素的大小, 如果相等再比较第二个(以此类推), 所以可以直接使用 <code>Sort</code></p><p>据此可以将上面的代码改为:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">Console.Write(<span class="string">&quot;请输入学生总数: &quot;</span>);</span><br><span class="line"><span class="built_in">int</span> n = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"></span><br><span class="line">Tuple&lt;<span class="built_in">int</span>, <span class="built_in">string</span>&gt;[] scores = <span class="keyword">new</span> Tuple&lt;<span class="built_in">int</span>, <span class="built_in">string</span>&gt;[n + <span class="number">1</span>];</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    Console.Write(<span class="string">&quot;请输入第&#123; 0 &#125;个学生的姓名: &quot;</span>, i);</span><br><span class="line">    <span class="built_in">string</span> b = Console.ReadLine();</span><br><span class="line">    Console.Write(<span class="string">&quot;请输入第&#123; 0 &#125;个学生的分数: &quot;</span>, i);</span><br><span class="line">    <span class="built_in">int</span> a = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"></span><br><span class="line">    scores[i] = Tuple.Create(a, b);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Array.Sort(scores, <span class="number">1</span>, n);</span><br><span class="line">Array.Reverse(scores, <span class="number">1</span>, n);</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;第&#123; 0, -2 &#125;名:  &#123; 1, -5 &#125;&#123; 2, -5 &#125;&quot;</span>, i, scores[i].Item1, scores[i].Item2);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>最后输出时的占位符 <code>&#123; 0, -2 &#125;</code> 中, 第一个参数 <code>0</code> 的意思与之前的 <code>&#123; 0 &#125;</code> 一样, 表示后面下标为 <code>0</code> 的对象, <code>-2</code> (的绝对值)表示输出的长度, 不足的补成空格, 负号表示左对齐(没有负号表示右对齐), 这样是为了输出的时候同一列数据可以左对齐, 好看一点, 你也可以不用</p><h2 id="数组相关函数">数组相关函数</h2><p>这里介绍一些相对常用的函数</p><h3 id="Array-Clear"><code>Array.Clear()</code></h3><p>用来清空数组</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Array.Clear(arrayName);</span><br><span class="line">Array.Clear(arrayName, index, length);</span><br></pre></td></tr></table></figure><h3 id="strName-Split"><code>strName.Split()</code></h3><p>注意这个不是对数组进行操作<br>这个函数的用处是, 将一个字符串按照你输入的分隔符分成由若干个字符串组成的 <code>string</code> 数组, 然后返回这个 <code>string</code> 数组</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">stringName.Split(Seperator);</span><br></pre></td></tr></table></figure><p>使用例:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> a = <span class="string">&quot;a ab abc abcd&quot;</span>;</span><br><span class="line"><span class="built_in">string</span>[] strArray = a.Split(<span class="string">&quot; &quot;</span>);</span><br><span class="line"><span class="keyword">foreach</span>(<span class="built_in">string</span> i <span class="keyword">in</span> strArray) &#123;</span><br><span class="line">    Console.WriteLine(i);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里会按空格来把 <code>a</code> 字符串分成四个字符串, 存到 <code>strArray</code> 这个字符串数组中</p><p>用这种方法我们就可以在一行内读入多个数据了</p><h3 id="例题-4-2-逆序输出">例题 4-2 逆序输出</h3><p>一行输入若干个整数, 在一行内倒序输出它们</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> temp = Console.ReadLine();</span><br><span class="line"><span class="built_in">string</span>[] a = temp.Split(<span class="string">&quot; &quot;</span>);</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i=a.Length<span class="number">-1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">    Console.Write(<span class="string">&quot;&#123; 0 &#125; &quot;</span>, a[i]);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="二维数组">二维数组</h2><p>之前说过可以声明更复杂类型的数组, 那么大家想没想过, 数组中的元素也可以是另一个数组呢!</p><p>数组中的子数组长度是可以不相同的, 那种叫做交错数组, 不太常用, 不在本文讨论范围之内<br><code>c#</code> 中的二维数组仅指每个子数组的长度都相同的那种</p><p>一个包含 x 个子数组, 其中每个子数组有 y 个元素的二维数组可以被看做一个 x 行 y 列的表格</p><p>声明二维数组的语法如下:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">type[,] array = <span class="keyword">new</span> type[x, y];</span><br></pre></td></tr></table></figure><p>例如声明一个 3 行 4 列的数组并初始化:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[,] a = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">3</span>, <span class="number">4</span>] &#123; </span><br><span class="line">    &#123; <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> &#125;, </span><br><span class="line">    &#123; <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span> &#125;, </span><br><span class="line">    &#123; <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span> &#125; </span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>换行是为了方便阅读, 当然是可以删掉的, 写成:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[,] a = <span class="keyword">new</span> <span class="built_in">int</span> [<span class="number">3</span>, <span class="number">4</span>] &#123; &#123; <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> &#125;, &#123; <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span> &#125;, &#123; <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span> &#125; &#125;;</span><br></pre></td></tr></table></figure><p>我们可以用 <code>a[i, j]</code> 来访问这个二维数组中第 <code>i</code> 行 第 <code>j</code> 列的元素, 例如:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[,] a = <span class="keyword">new</span> <span class="built_in">int</span> [<span class="number">3</span>,<span class="number">4</span>] &#123; &#123; <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> &#125;, &#123; <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span> &#125;, &#123; <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span> &#125; &#125;;</span><br><span class="line">Console.WriteLine(a[<span class="number">1</span>, <span class="number">2</span>]);</span><br></pre></td></tr></table></figure><p>从本质上讲, <code>a[1]</code> 访问的是 <code>a</code> 中的第 1 个元素(从 0 开始), 也就是一个数组 <code>&#123; 4, 5, 6, 7 &#125;</code><br>而例如 <code>a[1, 2]</code> 也就是访问 <code>a[2]</code> 中的第 2 个元素, 也就是 数组 <code>&#123; 4, 5, 6, 7 &#125;</code> 中的第 2 个元素, 所以 <code>a[i, j]</code> 为 6</p><p>不过在平时使用时不需过多关注它本质的意思, 当成表格就好</p><p>循环访问二维数组的元素如下:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[,] a = <span class="keyword">new</span> <span class="built_in">int</span> [<span class="number">3</span>,<span class="number">4</span>] &#123; &#123; <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> &#125;, &#123; <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span> &#125;, &#123; <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span> &#125; &#125;;</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; <span class="number">3</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j &lt; <span class="number">4</span>; j++) &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;(&#123; 0 &#125;, &#123; 1 &#125;): &#123; 2 &#125;&quot;</span>, i, j, a[i, j]);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>其实 <code>foreach</code> 也可以遍历二维数组中的所有元素, 但是一般情况下我们可能会需要数据的坐标(指位于的行和列), 那种情况下就不能用了</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[,] a = <span class="keyword">new</span> <span class="built_in">int</span> [<span class="number">3</span>,<span class="number">4</span>] &#123; &#123; <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> &#125;, &#123; <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span> &#125;, &#123; <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span> &#125; &#125;;</span><br><span class="line"><span class="keyword">foreach</span>(<span class="built_in">int</span> item <span class="keyword">in</span> a) &#123;</span><br><span class="line">    Console.WriteLine(item);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="综合运用-扫雷的棋盘生成">综合运用: 扫雷的棋盘生成</h2><p>大家都玩过扫雷吧, 我们这里做一个 <code>mapRow</code> × <code>mapColumn</code> 大小的棋盘(二维数组), 上面有 <code>mineNum</code> 个雷<br>我们用 <code>map[i]</code> 表示这个格子周围雷的数量, 如果为 <code>-1</code> 则表示这个格子就是雷</p><p>先声明一下:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> mapRow = <span class="number">10</span>, mapColumn = <span class="number">10</span>, mineNum = <span class="number">10</span>;</span><br><span class="line"><span class="built_in">int</span>[,] map = <span class="keyword">new</span> <span class="built_in">int</span>[mapRow+<span class="number">1</span>, mapColumn+<span class="number">1</span>];</span><br></pre></td></tr></table></figure><p>然后声明一下随机数要用的 <code>Random</code> 对象:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Random rd = <span class="keyword">new</span> Random();</span><br></pre></td></tr></table></figure><p>然后循环访问随机位置, 把它设成雷:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> cnt=<span class="number">1</span>; cnt &lt;= mineNum; ) &#123;  <span class="comment">// cnt 表示正在放第 cnt 个雷, 注意这后面没写 cnt++</span></span><br><span class="line">    <span class="built_in">int</span> x = rd.Next(<span class="number">1</span>, row+<span class="number">1</span>);  <span class="comment">// 注意范围为左闭右开, 所以 row 需要加 1</span></span><br><span class="line">    <span class="built_in">int</span> y = rd.Next(<span class="number">1</span>, col+<span class="number">1</span>); </span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (map[x, y] != <span class="number">-1</span>) &#123;  <span class="comment">// 不要重复放置雷, 那样雷的总数会少</span></span><br><span class="line">        map[x, y] = <span class="number">-1</span>;</span><br><span class="line">        cnt++;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>接下来要访问整个棋盘, 数每个不是雷的格子周围的雷的数量, 代码:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> row = <span class="number">1</span>; row &lt;= mapRow; row++) &#123;  <span class="comment">// 循环每行</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="built_in">int</span> col = <span class="number">1</span>; col &lt;= mapColumn; col++) &#123;  <span class="comment">// 循环每列</span></span><br><span class="line">        <span class="keyword">if</span> (map[row, col] != <span class="number">-1</span>) &#123;  <span class="comment">// 如果不是雷再计数</span></span><br><span class="line">            <span class="comment">// do something (见后文)</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>但我们要怎么遍历每个格子周围的 8 个格子?</p><p>其中一个方法是:</p><p>由于每个格子相邻的格子的横纵坐标都是当前坐标加减 1, 所以我们可以用这样两个一维数组:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span>[] moveRow    = &#123;  <span class="number">1</span>,  <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">-1</span>, <span class="number">-1</span>, <span class="number">-1</span>,  <span class="number">0</span> &#125;;  <span class="comment">// 加了一堆空格是为了便于理解</span></span><br><span class="line"><span class="built_in">int</span>[] moveColumn = &#123; <span class="number">-1</span>,  <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>,  <span class="number">1</span>,  <span class="number">0</span>, <span class="number">-1</span>, <span class="number">-1</span> &#125;;</span><br></pre></td></tr></table></figure><p>这样我们只要循环 <code>i</code>, 将当前的格子横纵坐标分别加上 <code>moveRow[i]</code> 和 <code>moveColumn[i]</code>, 就能遍历一个格子周围所有的位置了, 代码:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> cnt = <span class="number">0</span>;  <span class="comment">// 用来记录周围雷的数量</span></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; <span class="number">8</span>; i++) &#123;</span><br><span class="line">    <span class="built_in">int</span> currRow = row + moveRow[i];  <span class="comment">// 新的行数</span></span><br><span class="line">    <span class="built_in">int</span> currCol = col + moveColumn[i];  <span class="comment">// 新的列数</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 如果找到的位置不在地图中就跳过</span></span><br><span class="line">    <span class="keyword">if</span> (currRow &lt; <span class="number">1</span> || currRow &gt; mapRow || currCol &lt; <span class="number">1</span> || currCol &gt; mapColumn) &#123;<span class="keyword">continue</span>;&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (map[currRow, currCol] == <span class="number">-1</span>) &#123;  <span class="comment">// 如果是雷就 +1</span></span><br><span class="line">        cnt++;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">map[row, col] = cnt;</span><br></pre></td></tr></table></figure><p>另一个方法不需要辅助数组, 再写一个二重循环, 判断一下不是本格就好:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> cnt = <span class="number">0</span>;  <span class="comment">// 用来记录周围雷的数量</span></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">-1</span>; i &lt;= <span class="number">1</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">-1</span>; j &lt;= <span class="number">1</span>; j++) &#123;</span><br><span class="line">        <span class="built_in">int</span> currRow = row + i;  <span class="comment">// 新的行数</span></span><br><span class="line">        <span class="built_in">int</span> currCol = col + j;  <span class="comment">// 新的列数</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 如果找到的位置不在地图中就跳过</span></span><br><span class="line">    <span class="keyword">if</span> (currRow &lt; <span class="number">1</span> || currRow &gt; mapRow || currCol &lt; <span class="number">1</span> || currCol &gt; mapColumn) &#123;<span class="keyword">continue</span>;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 如果就是本格也跳过</span></span><br><span class="line">    <span class="keyword">if</span> (currRow == row &amp;&amp; currCol == col) &#123;<span class="keyword">continue</span>;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (map[currRow, currCol] == <span class="number">-1</span>) &#123;  <span class="comment">// 如果是雷就 +1</span></span><br><span class="line">        cnt++;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">map[row, col] = cnt;</span><br></pre></td></tr></table></figure><p>最后把上面的代码组合起来, 加个输出, 完整代码如下:</p><details class="toggle" ><summary class="toggle-button" style="">完整代码</summary><div class="toggle-content"><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> mapRow = <span class="number">10</span>, mapColumn = <span class="number">10</span>, mineNum = <span class="number">10</span>;</span><br><span class="line"><span class="built_in">int</span>[,] map = <span class="keyword">new</span> <span class="built_in">int</span>[mapRow+<span class="number">1</span>, mapColumn+<span class="number">1</span>];</span><br><span class="line"></span><br><span class="line"><span class="built_in">int</span>[] moveRow    = &#123; <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">-1</span>, <span class="number">-1</span>, <span class="number">-1</span>, <span class="number">0</span> &#125;;</span><br><span class="line"><span class="built_in">int</span>[] moveColumn = &#123; <span class="number">-1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">-1</span>, <span class="number">-1</span> &#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Random rd = <span class="keyword">new</span> Random();</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> cnt=<span class="number">1</span>; cnt &lt;= mineNum; ) &#123;  <span class="comment">// cnt 表示正在放第 cnt 个雷, 注意这后面没写 cnt++</span></span><br><span class="line">    <span class="built_in">int</span> x = rd.Next(<span class="number">1</span>, mapRow+<span class="number">1</span>);  <span class="comment">// 注意范围为左闭右开, 所以 row 需要加 1</span></span><br><span class="line">    <span class="built_in">int</span> y = rd.Next(<span class="number">1</span>, mapColumn+<span class="number">1</span>); </span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (map[x, y] != <span class="number">-1</span>) &#123;  <span class="comment">// 不要重复放置雷, 那样雷的总数会少</span></span><br><span class="line">        map[x, y] = <span class="number">-1</span>;</span><br><span class="line">        cnt++;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> row = <span class="number">1</span>; row &lt;= mapRow; row++) &#123;  <span class="comment">// 循环每行</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="built_in">int</span> col = <span class="number">1</span>; col &lt;= mapColumn; col++) &#123;  <span class="comment">// 循环每列</span></span><br><span class="line">        <span class="keyword">if</span> (map[row, col] != <span class="number">-1</span>) &#123;  <span class="comment">// 如果不是雷再计数</span></span><br><span class="line">            <span class="built_in">int</span> cnt = <span class="number">0</span>;  <span class="comment">// 用来记录周围雷的数量</span></span><br><span class="line">            <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; <span class="number">8</span>; i++) &#123;</span><br><span class="line">                <span class="built_in">int</span> currRow = row + moveRow[i];  <span class="comment">// 新的行数</span></span><br><span class="line">                <span class="built_in">int</span> currCol = col + moveColumn[i];  <span class="comment">// 新的列数</span></span><br><span class="line"></span><br><span class="line">                <span class="comment">// 如果找到的位置不在地图中就跳过</span></span><br><span class="line">                <span class="keyword">if</span> (currRow &lt; <span class="number">1</span> || currRow &gt; mapRow || currCol &lt; <span class="number">1</span> || currCol &gt; mapColumn) &#123;<span class="keyword">continue</span>;&#125;</span><br><span class="line">                </span><br><span class="line">                <span class="keyword">if</span> (map[currRow, currCol] == <span class="number">-1</span>) &#123;  <span class="comment">// 如果是雷就 +1</span></span><br><span class="line">                    cnt++;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            map[row, col] = cnt;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">1</span>; i &lt;= mapRow; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">1</span>; j &lt;= mapColumn; j++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (map[i, j] == <span class="number">-1</span>) &#123;</span><br><span class="line">            Console.Write(<span class="string">&quot;* &quot;</span>);  <span class="comment">// 为了便于观察, 如果是雷就输出星号</span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            Console.Write(<span class="string">&quot;&#123; 0 &#125; &quot;</span>, map[i, j]);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;&quot;</span>);  <span class="comment">// 输出空行</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div></details><p>刚刚在我的电脑上产生的随机输出结果如下:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">0  0  0  0  0  2  *  2  0  0  </span><br><span class="line">0  0  0  1  1  3  *  2  1  1</span><br><span class="line">0  0  0  1  *  2  1  1  1  *</span><br><span class="line">0  0  0  1  1  1  0  0  2  2</span><br><span class="line">1  2  2  2  1  0  0  0  1  *</span><br><span class="line">*  2  *  *  1  0  1  1  2  1</span><br><span class="line">1  2  2  2  1  0  1  *  1  0</span><br><span class="line">0  0  0  0  0  0  1  1  1  0</span><br><span class="line">0  0  0  0  0  0  0  0  1  1</span><br><span class="line">0  0  0  0  0  0  0  0  1  *</span><br></pre></td></tr></table></figure><h2 id="再谈字符串">再谈字符串</h2><p>字符串也可以用下标进行访问, 但是不能用下标直接修改:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> str = <span class="string">&quot;abcde&quot;</span>;</span><br><span class="line">Console.WriteLine(str[<span class="number">0</span>]);  <span class="comment">//正常运行</span></span><br><span class="line">str[<span class="number">1</span>] = <span class="string">&#x27;c&#x27;</span>;  <span class="comment">// 报错</span></span><br></pre></td></tr></table></figure><p>字符串也有 <code>Length</code> 属性, 所以可以用 <code>str.Length</code> 访问：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> str = <span class="string">&quot;abcde&quot;</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; str.Length; i++) &#123;</span><br><span class="line">    Console.WriteLine(str[i]);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当然也可以用 <code>foreach</code> 语句循环遍历字符串:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> str = <span class="string">&quot;abcde&quot;</span>;</span><br><span class="line"><span class="keyword">foreach</span>(<span class="built_in">char</span> c <span class="keyword">in</span> str) &#123;</span><br><span class="line">    Console.WriteLine(c);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>但大家可能有些疑问，为什么是 <code>char</code> 而不是 <code>string c</code></p><p>因为字符串的本意就是一堆 “字符” 串起来, 也就是说, 字符串中的每一个元素应该是一个字符<br><code>char</code> 就是表示字符的数据类型(英文character的缩写), 字符<code>a</code> 记为 <code>'a'</code></p><p>因为 <code>'a'</code> (字符<code>a</code>)容易与 <code>&quot;a&quot;</code> (字符串<code>a</code>)混淆所以之前一直没有提过, 他们的区别就类似于int类型的 <code>5</code> 与 只有一个int类型的元素的数组 <code>&#123; 5 &#125;</code>, 是不一样的东西</p><h3 id="例题-4-3-洛谷B2124-判断字符串是否为回文">例题 4-3 [洛谷<a href="https://www.luogu.com.cn/problem/B2124">B2124</a>] 判断字符串是否为回文</h3><p>输入一个字符串，输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。<br>如果字符串是回文，输出 <code>yes</code> 否则，输出 <code>no</code></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> str = Console.ReadLine();</span><br><span class="line"><span class="built_in">int</span> length = str.Length;</span><br><span class="line"></span><br><span class="line"><span class="built_in">bool</span> suc = <span class="literal">true</span>; </span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; length / <span class="number">2</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (str[i] != str[length-i<span class="number">-1</span>]) &#123;</span><br><span class="line">        suc = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (suc) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;yes&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;no&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="练习">练习</h2><h3 id="4-1-最高分与最低分之差">4-1 <a href="https://www.nowcoder.com/practice/e0e4f81dcd55408a8973f8033bbeb1d2?tpId=107&amp;&amp;tqId=33376&amp;rp=1&amp;ru=/ta/beginner-programmers&amp;qru=/ta/beginner-programmers/question-ranking">最高分与最低分之差</a></h3><p>先读入 n , 下一行输入 n 个成绩，输出 n 个成绩中最高分数和最低分数的差。</p><h3 id="4-2-洛谷B2122-单词翻转">4-2 [洛谷<a href="https://www.luogu.com.cn/problem/B2122">B2122</a>] 单词翻转</h3><p>小明同学写单词的时候喜欢反着写，比如 <code>hello</code> 他会写成 <code>olleh</code><br>给出小明同学写的一个句子，请你将所有的单词复原。</p><h4 id="输入">输入</h4><p>共一行，一个字符串表示句子，单词之间以空格分隔。</p><h4 id="输出">输出</h4><p>每个单词一行</p><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">样例输入</button><button type="button" class="tab">样例输出</button></div><div class="tab-contents"><div class="tab-item-content active"><p>olleh dlrow</p></div><div class="tab-item-content"><p>hello world</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h3 id="4-3-完善学生分数排名系统">4-3 完善学生分数排名系统</h3><p>接着完善一下学生分数排名的程序:</p><ol><li>本文给的代码只能处理整数, 改成能处理浮点数的</li><li>对输入做一下判断, 例如: 如果输入的分数根本不能变为浮点数或者输入数字大于满分或者小于0, 就让它重新输入</li><li>输出平均分数</li></ol><details class="toggle" ><summary class="toggle-button" style="">提示</summary><div class="toggle-content"><ol><li>使用 Convert.ToDouble()</li><li>可以用while循环 条件为输入正确</li></ol></div></details>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;声明数组&quot;&gt;声明数组&lt;/h2&gt;
&lt;p&gt;数组是一个存储相同类型数据的固定大小的顺序集合。用简单的话来说就是，数组可以用单个变量名来访问很多同一类型的数据，而不需要声明很多的变量。&lt;/p&gt;
&lt;p&gt;假设我们正在做一个把所有一共 &lt;code&gt;n&lt;/code&gt; 个学生的分数</summary>
      
    
    
    
    <category term="c#" scheme="https://blog.satori-march.top/categories/csharp/"/>
    
    <category term="电子电路社" scheme="https://blog.satori-march.top/categories/%E7%94%B5%E5%AD%90%E7%94%B5%E8%B7%AF%E7%A4%BE/"/>
    
    <category term="c#教程" scheme="https://blog.satori-march.top/categories/csharp/charp-tutorial/"/>
    
    
    <category term="c#" scheme="https://blog.satori-march.top/tags/csharp/"/>
    
  </entry>
  
  <entry>
    <title>[题解] csp-s2021 T2 括号序列</title>
    <link href="https://blog.satori-march.top/posts/OI/solution/csp-s2021T2/"/>
    <id>https://blog.satori-march.top/posts/OI/solution/csp-s2021T2/</id>
    <published>2021-12-19T00:00:00.000Z</published>
    <updated>2025-02-14T07:24:55.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>本文于 2023.03.26 大修（近半重写）</p></blockquote><p>因为 csp-s 考的太惨了，所以一直想着回头把前三题都AC了，结果一拖拖到现在才做完（</p><p>还有就是动态规划好难（wtcl）</p><h2 id="题意">题意</h2><p>本题题意较复杂，建议直接去看原题（<a href="https://www.luogu.com.cn/problem/P7914">题目链接</a>）。</p><p>总的来说，合法的括号序列一共分两类：</p><ol><li><p>包含型：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">()</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mclose">)</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(AS)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>S</mi><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(SA)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span></p></li><li><p>并列型： <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">AB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> ，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>S</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">ASB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">SB</span></span></span></span></p></li></ol><p>显然合法的括号序列两端必然分别是左右括号，而且合法的括号序列最小长度为2。</p><h2 id="初步分析">初步分析</h2><p>数据范围可知这题大概需要一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n^3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 的方法</p><p>这道题一看就像是<a href="https://oiwiki.org/dp/interval/">区间DP</a>。设状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">f[i][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 表示 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mi>i</mi><mo separator="true">,</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[i,j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 这段区间内的数量，由于上文已经<s>证明</s>看出“合法的括号序列两端必然分别是左右括号”，所以需要先确保 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span> 对应位置可以为 <code>(</code>,即 <code>a[i] == '(' || a[i] == '?'</code>，对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 也同理，不满足的话 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">f[i][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 一律为 0。后文的讨论均基于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo separator="true">,</mo><mi>j</mi></mrow><annotation encoding="application/x-tex">i,j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">i</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 满足要求的情况。</p><p>按照刚刚上面的分类进行讨论，记 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s[i][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 表示 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mi>i</mi><mo>:</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[i:j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 能否完全由不超过 k 个连续的 <code>*</code> 或者 <code>?</code> 组成，或者说 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s[i][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 表示 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">a[i][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 能否构成题目中的 S。则可列出方程：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.16em" columnalign="left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo><mo>:</mo><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>+</mo><mo>=</mo><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mi>S</mi><mo stretchy="false">)</mo><mo>:</mo><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>+</mo><mo>=</mo><mn>1</mn><mo separator="true">,</mo><mi>s</mi><mo stretchy="false">[</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo>=</mo><mi>t</mi><mi>r</mi><mi>u</mi><mi>e</mi></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\left. \begin{array}{ l }{ (A):f [i] [j] += f[i+1][j-1] } \\{ (S):f[i][j] += 1, s[i+1][j-1]=true } \\\end{array} \right.</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.4em;vertical-align:-0.95em;"></span><span class="minner"><span class="mopen nulldelimiter"></span><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mord">+</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">]</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mord">+</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">s</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>（放在逗号右面表示只有当满足这个条件时才计算）</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(AS)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span> 只要枚举一下 S 就行，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 为 A 的右端点（包含）：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mi>S</mi><mo stretchy="false">)</mo><mo>:</mo><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>+</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>p</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>2</mn></mrow><mrow><mi>j</mi><mo>−</mo><mn>1</mn></mrow></munderover><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo><mo separator="true">,</mo><mtext> </mtext><mi>s</mi><mo stretchy="false">[</mo><mi>p</mi><mo>+</mo><mn>1</mn><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo>=</mo><mi>t</mi><mi>r</mi><mi>u</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">{ (AS):f[i][j] += \sum_{p=i+2}^{j-1}f[i][p],\space s[p+1][j-1]=true }</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.2726em;vertical-align:-1.4138em;"></span><span class="mord"><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mord">+</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8588em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">2</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3471em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">s</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span></span></span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>S</mi><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(SA)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span> 与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(AS)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span> 差不多，<s>留作习题答案略</s>。那么包含型的情况已经讨论完了。</p><p>下面是并列型的情况。在计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>S</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">ASB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">SB</span></span></span></span> 的贡献的时候，如果像我们刚刚那样设计状态就会列出<strong>错误</strong>的方程：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>+</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>p</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mrow><mi>j</mi><mo>−</mo><mn>2</mn></mrow></munderover><munderover><mo>∑</mo><mrow><mi>q</mi><mo>=</mo><mi>p</mi><mo>+</mo><mn>1</mn></mrow><mrow><mi>j</mi><mo>−</mo><mn>1</mn></mrow></munderover><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo><mo>×</mo><mi>f</mi><mo stretchy="false">[</mo><mi>q</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo separator="true">,</mo><mtext> </mtext><mi>s</mi><mo stretchy="false">[</mo><mi>p</mi><mo>+</mo><mn>1</mn><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>q</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo>=</mo><mi>t</mi><mi>r</mi><mi>u</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">f[i][j]+=\sum_{p=i+1}^{j-2}\sum_{q=p+1}^{j-1} f[i][p]\times f[q][j],\space s[p+1][q-1]=true</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mord">+</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.2726em;vertical-align:-1.4138em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8588em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3471em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8588em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">p</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3471em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4032em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">s</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span></span></span></span></span></p><p>这个式子即枚举 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span> 的右端点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 的左端点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span>（均包含）来间接枚举 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mo>=</mo><mi>a</mi><mo stretchy="false">[</mo><mi>p</mi><mo>+</mo><mn>1</mn><mo>:</mo><mi>q</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">S=a[p+1:q-1]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span></span></span></span>，从而转移 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>S</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">ASB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">SB</span></span></span></span>，这里 S 能取空所以可以连 AB 的情况一起处理。</p><p>但是这样的转移方程为什么是错的呢，我们看下面这样的括号序列：</p><p><code>()()??()</code></p><p>有以下几种情况：</p><table><thead><tr><th>cnt</th><th>A</th><th>S</th><th>B</th><th>ASB</th></tr></thead><tbody><tr><td>1</td><td>()</td><td>null</td><td>()()()</td><td>()()()()</td></tr><tr><td>2</td><td>()</td><td>null</td><td>()**()</td><td>()()**()</td></tr><tr><td>3</td><td>()()</td><td>null</td><td>()()</td><td>()()()()</td></tr><tr><td>4</td><td>()()</td><td>null</td><td>**()</td><td>()()**()</td></tr><tr><td>5</td><td>()()</td><td>**</td><td>()</td><td>()()**()</td></tr><tr><td>6</td><td>()()()</td><td>null</td><td>()</td><td>()()()()</td></tr></tbody></table><p>显然<strong>算重了</strong>（由于在计算子区间 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 的并列型情况时还会有重复，所以按这种错误方法算出的情况数不止上述 6 种）。</p><h2 id="去重">去重</h2><p>如果每次在左边的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span> 只枚举<strong>包含型</strong>，不枚举<strong>并列型</strong>的结构，而 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 包含型与并列型都枚举，这样每种拆法就只会数一次了。后文将这种拆法表示为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mi>S</mi><mo stretchy="false">?</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">FS?B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">FS</span><span class="mclose">?</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span>（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">?</mo></mrow><annotation encoding="application/x-tex">?</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mclose">?</span></span></span></span> 表示可有可无）。由于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mi>S</mi><mo stretchy="false">?</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">FS?B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">FS</span><span class="mclose">?</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 没法再拆成其他的并列型，所以显然不会重复，下面简要证明不会遗漏：</p><p>一种<strong>并列型</strong>的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span> 总能表示为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>=</mo><mi>F</mi><mo>+</mo><msup><mi>S</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">?</mo><mo>+</mo><msup><mi>B</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">A = F+S&#x27;?+B&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8352em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">?</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>，其中  <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi></mrow><annotation encoding="application/x-tex">F</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span></span></span></span> 为包含型，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>B</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">B&#x27;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 任意，情况 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mi>S</mi><mo stretchy="false">?</mo><mo>+</mo><mi>B</mi><mo>=</mo><mi>F</mi><mo>+</mo><msup><mi>S</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">?</mo><mo>+</mo><msup><mi>B</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mi>S</mi><mo stretchy="false">?</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">A+S?+B = F+S&#x27;?+B&#x27;S?B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">?</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8352em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">?</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">?</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span>，符合 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mi>S</mi><mo stretchy="false">?</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">FS?B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">FS</span><span class="mclose">?</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span>，故能够被计数。</p><p>重新设计一下状态，用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">f[i][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 表示该区间内包含型序列的数量，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">g[i][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 表示并列型序列的数量。</p><p>重新看一下原来的转移方程，你会发现 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span> 的转移方程不需要改，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(AS)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span> 的转移方程只是把后面的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">f[i][p]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span></span></span></span> 改成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo><mo>+</mo><mi>g</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">f[i][p]+g[i][p]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span></span></span></span> 即可。</p><p>仿照原来的思路，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>S</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">ASB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">SB</span></span></span></span> 的转移方程如下：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>g</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>p</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mrow><mi>j</mi><mo>−</mo><mn>2</mn></mrow></munderover><munderover><mo>∑</mo><mrow><mi>q</mi><mo>=</mo><mi>p</mi><mo>+</mo><mn>1</mn></mrow><mrow><mi>j</mi><mo>−</mo><mn>1</mn></mrow></munderover><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo><mo>×</mo><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">[</mo><mi>q</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>+</mo><mi>g</mi><mo stretchy="false">[</mo><mi>q</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo><mo separator="true">,</mo><mtext> </mtext><mi>s</mi><mo stretchy="false">[</mo><mi>p</mi><mo>+</mo><mn>1</mn><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>q</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo>=</mo><mi>t</mi><mi>r</mi><mi>u</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">g[i][j] = \sum_{p=i+1}^{j-2}\sum_{q=p+1}^{j-1} f[i][p] \times (f[q][j]+g[q][j]),\space s[p+1][q-1] = true</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.2726em;vertical-align:-1.4138em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8588em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3471em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8588em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">p</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3471em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4032em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">])</span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">s</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span></span></span></span></span></p><p>代码如下（为了清晰直观，删去取模的过程）：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span>(<span class="type">int</span> p=i<span class="number">+1</span>; p &lt;= j<span class="number">-2</span>; p++)&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> q=p<span class="number">+1</span>; q &lt;= j<span class="number">-1</span>; q++)&#123;</span><br><span class="line">        <span class="keyword">if</span>(s[p<span class="number">+1</span>][q<span class="number">-1</span>] || q == p<span class="number">+1</span>) g[i][j] += (ULL)f[i][p] * (f[q][j] + g[q][j]);</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>按这个思路写对了应该就能拿到 65 pts 了，现在离 AC 还差一个优化。</p><h2 id="优化">优化</h2><p>复杂度瓶颈在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>S</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">ASB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">SB</span></span></span></span> 的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>4</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n^4)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 上，所以观察 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>S</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">ASB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">SB</span></span></span></span> 的式子，此时先把 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 当做定值。</p><p>后面的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">f[i][p]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span></span></span></span> 的值与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span> 无关，因此我们可以把 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">f[i][p]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span></span></span></span> 从最内层的求和里提出来。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><munderover><mo>∑</mo><mrow><mi>p</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mrow><mi>j</mi><mo>−</mo><mn>2</mn></mrow></munderover><mi>f</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo><mo>×</mo><munderover><mo>∑</mo><mrow><mi>q</mi><mo>=</mo><mi>p</mi><mo>+</mo><mn>1</mn></mrow><mrow><mi>j</mi><mo>−</mo><mn>1</mn></mrow></munderover><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">[</mo><mi>q</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>+</mo><mi>g</mi><mo stretchy="false">[</mo><mi>q</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo><mo separator="true">,</mo><mtext> </mtext><mi>s</mi><mo stretchy="false">[</mo><mi>p</mi><mo>+</mo><mn>1</mn><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>q</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo>=</mo><mi>t</mi><mi>r</mi><mi>u</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">\sum_{p=i+1}^{j-2}f[i][p]\times\sum_{q=p+1}^{j-1}(f[q][j]+g[q][j]),\space s[p+1][q-1] = true</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.2726em;vertical-align:-1.4138em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8588em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3471em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:3.262em;vertical-align:-1.4032em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8588em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">p</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3471em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4032em;"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">])</span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">s</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">u</span><span class="mord mathnormal">e</span></span></span></span></span></p><p>只关注内层的循环，这时如何优化就明显一些了——前缀和。</p><p>我们设一个新数组 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi></mrow><annotation encoding="application/x-tex">h</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">h</span></span></span></span>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>h</mi><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>t</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>2</mn></mrow><mi>p</mi></munderover><mi>f</mi><mo stretchy="false">[</mo><mi>t</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>+</mo><mi>g</mi><mo stretchy="false">[</mo><mi>t</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">h[p]=\sum_{t=i+2}^{p}f[t][j]+g[t][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">h</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0345em;vertical-align:-1.336em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6985em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">2</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3471em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.336em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal">t</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">[</span><span class="mord mathnormal">t</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span></span></p><p>若忽略 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> 的条件，最内层循环等于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi><mo stretchy="false">[</mo><mi>j</mi><mo>−</mo><mn>1</mn><mo stretchy="false">]</mo><mo>−</mo><mi>h</mi><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">h[j-1] - h[p]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">h</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">h</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span></span></span></span>。</p><p>再考虑 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>，由于最内层循环在递增的是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 而 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span> 并不变化——作为条件的区间 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> 是左端点不动向右延伸的——我们可以预处理出每一个位置往后延伸的 <code>*</code> 或者 <code>?</code> 的最长的长度，记为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">b[i]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span></span></span></span>，则从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">p+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 点最远能延伸到的下标为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>+</mo><mn>1</mn><mo>+</mo><mi>b</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">p+1+b[i]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span></span></span></span>。所以我们就可以在每次循环 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span> 的时候预处理 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi></mrow><annotation encoding="application/x-tex">h</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">h</span></span></span></span> 数组的值，用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi><mo stretchy="false">[</mo><mi>m</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mi>j</mi><mo separator="true">,</mo><mi>p</mi><mo>+</mo><mi>b</mi><mo stretchy="false">[</mo><mi>p</mi><mo>+</mo><mn>1</mn><mo stretchy="false">]</mo><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo stretchy="false">]</mo><mo>−</mo><mi>h</mi><mo stretchy="false">[</mo><mi>p</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">h[min(j, p+b[p+1]+1)] - h[p]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">h</span><span class="mopen">[</span><span class="mord mathnormal">min</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">h</span><span class="mopen">[</span><span class="mord mathnormal">p</span><span class="mclose">]</span></span></span></span> 代替原来最内层的求和了。</p><p>因为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span> 递增，所以不用担心 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>q</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">f[q][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">[</mo><mi>q</mi><mo stretchy="false">]</mo><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">f[q][j]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mclose">]</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span> 还没有求（这两个区间肯定比正在求的小）。</p><p>（其实建议预处理时直接处理出向后延伸到的最大下标，应该会方便一点，但我懒得改了）</p><p>最终代码（代码丑，请见谅）：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">constexpr</span> <span class="type">int</span> maxn = <span class="number">550</span>;</span><br><span class="line"><span class="keyword">constexpr</span> <span class="type">int</span> MOD = <span class="number">1&#x27;000&#x27;000&#x27;007</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> ull = <span class="type">unsigned</span> <span class="type">long</span> <span class="type">long</span>;</span><br><span class="line"><span class="keyword">using</span> ll = <span class="type">long</span> <span class="type">long</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">normal</span><span class="params">(ll x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="type">int</span> rst = x % MOD;</span><br><span class="line">    <span class="keyword">if</span> (rst &lt; <span class="number">0</span>) rst += MOD;</span><br><span class="line">    <span class="keyword">return</span> rst;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 计算模意义下可变个数的参数的和，用法： add(...)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">add</span><span class="params">(T x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">normal</span>(x);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span>... Ts&gt;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">add</span><span class="params">(T x, Ts... args)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">normal</span>(x + <span class="built_in">add</span>(args...));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">mul</span><span class="params">(<span class="type">int</span> a, <span class="type">int</span> b)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">normal</span>(<span class="built_in">ll</span>(a) * <span class="built_in">ll</span>(b));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> n, k;</span><br><span class="line"><span class="type">char</span> a[maxn];</span><br><span class="line"><span class="type">int</span> f[maxn][maxn];   <span class="comment">// 包含型，后用 F 代替</span></span><br><span class="line"><span class="type">int</span> g[maxn][maxn];   <span class="comment">// 并列型，后用 G 代替</span></span><br><span class="line"><span class="type">bool</span> s[maxn][maxn];  <span class="comment">// a[i:j] 能否构成连续个数小于 k 的 *</span></span><br><span class="line"><span class="type">int</span> h[maxn], b[maxn];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">&quot;%d%d&quot;</span>, &amp;n, &amp;k);</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">&quot;%s&quot;</span>, a + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        <span class="type">int</span> j;</span><br><span class="line">        <span class="keyword">for</span> (j = i; j &lt;= n &amp;&amp; j - i + <span class="number">1</span> &lt;= k; j++) &#123;</span><br><span class="line">            <span class="keyword">if</span> (a[j] == <span class="string">&#x27;*&#x27;</span> || a[j] == <span class="string">&#x27;?&#x27;</span>)</span><br><span class="line">                s[i][j] = <span class="literal">true</span>;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        b[i] = j - i;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> l = <span class="number">2</span>; l &lt;= n; l++) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i + l - <span class="number">1</span> &lt;= n; i++) &#123;</span><br><span class="line">            <span class="type">int</span> j = i + l - <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 合法的括号序列两端必然分别是左右括号</span></span><br><span class="line">            <span class="keyword">if</span> ((a[i] != <span class="string">&#x27;(&#x27;</span> &amp;&amp; a[i] != <span class="string">&#x27;?&#x27;</span>) || (a[j] != <span class="string">&#x27;)&#x27;</span> &amp;&amp; a[j] != <span class="string">&#x27;?&#x27;</span>)) <span class="keyword">continue</span>;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (i + <span class="number">1</span> == j) &#123;  <span class="comment">// 单独一对括号 ()</span></span><br><span class="line">                f[i][j] = <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (s[i + <span class="number">1</span>][j - <span class="number">1</span>]) f[i][j] = <span class="number">1</span>;  <span class="comment">// (S)</span></span><br><span class="line"></span><br><span class="line">            f[i][j] = <span class="built_in">add</span>(f[i][j], f[i + <span class="number">1</span>][j - <span class="number">1</span>], g[i + <span class="number">1</span>][j - <span class="number">1</span>]);  <span class="comment">// (F) 或 (G), 对应 (A)</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> p = i + <span class="number">1</span>; p &lt; j - <span class="number">1</span>; p++) &#123;  <span class="comment">// (SF) 或 (SG), 对应 (SA)</span></span><br><span class="line">                <span class="keyword">if</span> (s[i + <span class="number">1</span>][p])</span><br><span class="line">                    f[i][j] = <span class="built_in">add</span>(f[i][j], f[p + <span class="number">1</span>][j - <span class="number">1</span>], g[p + <span class="number">1</span>][j - <span class="number">1</span>]);</span><br><span class="line">                <span class="keyword">else</span></span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> p = j - <span class="number">1</span>; p &gt; i + <span class="number">1</span>; p--) &#123;  <span class="comment">// (FS) 或 (GS), 对应 (AS)</span></span><br><span class="line">                <span class="keyword">if</span> (s[p][j - <span class="number">1</span>])</span><br><span class="line">                    f[i][j] = <span class="built_in">add</span>(f[i][j], f[i + <span class="number">1</span>][p - <span class="number">1</span>], g[i + <span class="number">1</span>][p - <span class="number">1</span>]);</span><br><span class="line">                <span class="keyword">else</span></span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// AB 或者 ASB</span></span><br><span class="line"></span><br><span class="line">            h[i + <span class="number">1</span>] = <span class="number">0</span>;  <span class="comment">// 前缀和优化</span></span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> p = i + <span class="number">2</span>; p &lt;= j; p++) &#123;</span><br><span class="line">                h[p] = <span class="built_in">add</span>(h[p - <span class="number">1</span>], f[p][j], g[p][j]);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> p = i + <span class="number">1</span>; p &lt;= j - <span class="number">2</span>; p++) &#123;</span><br><span class="line">                g[i][j] = <span class="built_in">add</span>(g[i][j], <span class="built_in">normal</span>(<span class="built_in">mul</span>(f[i][p], <span class="built_in">add</span>(h[<span class="built_in">min</span>(j, p + b[p + <span class="number">1</span>] + <span class="number">1</span>)], -h[p]))));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%d&quot;</span>, <span class="built_in">add</span>(f[<span class="number">1</span>][n], g[<span class="number">1</span>][n]));</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;本文于 2023.03.26 大修（近半重写）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因为 csp-s 考的太惨了，所以一直想着回头把前三题都AC了，结果一拖拖到现在才做完（&lt;/p&gt;
&lt;p&gt;还有就是动态规划好难（wtcl）&lt;/p&gt;
&lt;h2 id</summary>
      
    
    
    
    <category term="OI" scheme="https://blog.satori-march.top/categories/OI/"/>
    
    <category term="题解" scheme="https://blog.satori-march.top/categories/OI/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="OI" scheme="https://blog.satori-march.top/tags/OI/"/>
    
    <category term="动态规划" scheme="https://blog.satori-march.top/tags/DP/"/>
    
  </entry>
  
  <entry>
    <title>C#基础教程[3] 再谈类型</title>
    <link href="https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[3]%E5%86%8D%E8%B0%88%E7%B1%BB%E5%9E%8B/"/>
    <id>https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[3]%E5%86%8D%E8%B0%88%E7%B1%BB%E5%9E%8B/</id>
    <published>2021-12-06T00:00:00.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>本文主要由zbx1425大佬所写</p></blockquote><h2 id="再谈数据类型">再谈数据类型</h2><p>数据类型是一个初学者不太容易搞懂的概念，所以我们还要再强调一下。<br>首先，C#中的每一个“值”都是有类型的。包括由我们直接写出的称为“字面量”的东西（如 123， “Hello World”），变量的内容，以及函数返回的结果。（注：“返回 xxx” 意思就是函数运行的结果是xxx）</p><ul><li><p><code>1</code> - <code>int</code>: 不带小数点的数字是 int 类型的 “字面量”</p></li><li><p><code>1.0</code> - <code>double</code>: 带上小数点之后，它就成了一个 double 类型的 “字面量”<br>请仔细注意这里的区别。例如 <code>3 / 2</code> 结果是 1，因为被除数和除数都是 int 所以执行了整数除法；但 <code>3.0 / 2</code> 由于被除数是 double 会执行浮点数除法，结果就是 1.5 了，这就是类型不同引发的差异，即使是对于直接给出的“字面量”也是同样。</p></li></ul><div class="note info flat"><p>被除数和除数中只要有一个是浮点数就会执行浮点数除法</p></div><ul><li><p><code>&quot;1.0&quot;</code> - <code>string</code>: 双引号括起来的是 string 类型的 “字面量”，注意它和不带双引号的值 <code>1.0</code> 的类型与意义可完全不同！以及，（与Python不同）单引号括起来的是另一个没提过的类型，<code>C#</code> 中区分单双引号，只能用双引号表示 <code>string</code>，不要用错。</p></li><li><p><code>Convert.ToInt32(&quot;3&quot;)</code> - 一个 string 传入 <code>Convert.ToInt32</code> 函数，该函数返回 int 类型，所以它整体的结果是 int 类型的 3。</p></li></ul><p>一个函数接收什么类型的值，与返回什么类型的值，是由其定义决定的。难道要一个个背？不用！SharpDevelop 提供了一个贴心小功能来让您快速了解这一关键信息。<br>在提示列表中查找函数时，或将鼠标指针放在代码中一个函数的名称上时，将会显示一个黄底的提示框，里面有形如这样的信息（此处以<code>ToInt32</code>为例）：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[↑] <span class="number">1</span> of <span class="number">19</span> [↓] <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">int</span> <span class="title">ToInt32</span>(<span class="params"><span class="built_in">string</span> <span class="keyword">value</span></span>)</span>;</span><br></pre></td></tr></table></figure><ul><li><code>1 of 19</code>: 表示该函数有19种用法，也就是说可以接受19种参数（用专业名词说叫“重载”）（想不到这么多吧，233，这个函数挺强大的，不仅是string，一大堆东西都能给它转换成int），此处显示了第一种。可以点击左右的上下箭头按钮来查看全部的用法。</li><li><code>public</code> <code>static</code>: 这俩咱现在不用管。</li><li><code>int</code>: 这个在 <code>ToInt32</code> 函数名之前的第一个单词，就代表了它的返回类型。在这个例子中，您就知道这个函数（在这种用法中）运行之后的结果一定是一个int整数。</li><li><code>(string value)</code>: 括号里的是使用这个函数时要传入的参数。前一个单词是类型，后一个单词是名字，有多个时会用逗号分开显示。您在上节课的练习中把<code>Console.ReadLine()</code>读出来的string转换成int时，不就是在括号中传入了一个string类型的值－输入进来的文字么？</li></ul><p>我们再来看一看下面这段代码。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Console.WriteLine(Convert.ToString(Convert.ToDouble(Console.ReadLine()) / <span class="number">2</span>));</span><br></pre></td></tr></table></figure><p>这段代码看起来很长，对于初学可能相对难以理解，让我们一点一点来解释。</p><p>我们上次讲过嵌套函数的运行类似数学中的复合函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(g(x))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">))</span></span></span></span> , 从最内层的函数开始运行, 然后把返回的数值代入到外面一层的函数中作为参数。</p><ol><li>首先是最内层的 <code>Console.ReadLine()</code> 运行，并把读入的一行字以 string 类型返回。如果输入的是 5，现在代码就变成了：</li></ol><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Console.WriteLine(Convert.ToString(Convert.ToDouble(<span class="string">&quot;5&quot;</span>) / <span class="number">2</span>));</span><br></pre></td></tr></table></figure><ol start="2"><li>Convert.ToDouble(“5”) 运行，将 “5” 转换成 double 的 5.0 并返回。</li></ol><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Console.WriteLine(Convert.ToString(<span class="number">5.0</span> / <span class="number">2</span>));</span><br></pre></td></tr></table></figure><ol start="3"><li>由于一边是 double 一边是 int，运行了浮点数除法，结果是 double 的 2.5。随后 2.5 被Convert.ToString 转换成 string 的 “2.5”，然后被 Console.WriteLine 写到窗口中。</li><li>其实在这个例子中，如果去掉 Convert.ToString，也照样能够输出。这是因为 Console.WriteLine 也是有一大堆“用法”，不仅接受 string 也接受 double，您不妨在那个“用法列表”里找一找。</li></ol><p>显然，如果不把值放在一个变量里，那一行代码执行完了之后值就没了。变量就是一种储存值的容器。正如上一节课中介绍的，在C#中，一个变量只能储存一种特定类型的值。</p><p>比如我们需要以 <code>double</code> 类型保存下来输入的内容以备以后再用, 那就把上面的代码改成：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">double</span> a = Convert.ToDouble(Console.ReadLine());</span><br><span class="line">Console.WriteLine(Convert.ToString(a / <span class="number">2</span>));</span><br></pre></td></tr></table></figure><h2 id="new-运算符">new 运算符</h2><p>编程中要处理各种各样的数据, 要是只有我们学过的 <code>int</code> <code>string</code> <code>double</code> 那几种类型可能会十分麻烦, 例如要是用 <code>int</code> 来保存当前时间的话 就需要 6 个 <code>int</code> 类型的变量来分别保存年月日时分秒。因此 <code>C#</code> 里除了我们已经用到的 string int double 之外，还提供了很多其他的类型。</p><p>那么问题来了。在使用 string int double 的时候，除了从函数中取得（如<code>Console.ReadLine()</code>），我们想要用一个值的时候都可以用字面量的形式写出来。比如我们想要整数1就可以直接写1，想要字符串Hello就直接&quot;Hello&quot;。但是字面量就只能表示这些最基础的类型了。<br>假如我们想要一个表示 1919年8月10日11:45:14 的时间（在C#中有个专门的类型用来表示和处理时间，叫<code>DateTime</code>），就没有办法用字面量写出来了，怎么办呢？</p><p>大佬们自然给我们想好了。这就是&quot;new 运算符&quot;。<code>new DateTime(1919, 8, 10, 11, 45, 14)</code> 就会给我们一个我们想要的值了。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">DateTime a = <span class="keyword">new</span> DateTime(<span class="number">1919</span>, ...); <span class="comment">// 既可以存在变量里（此处省略后面的数字）</span></span><br><span class="line">Console.WriteLine(Convert.ToString(<span class="keyword">new</span> DateTime(<span class="number">1919</span>, ...))); <span class="comment">// 也可以像之前的字面量一样直接用</span></span><br></pre></td></tr></table></figure><p>这个用法是不是很像在用一个函数？实际上它就是一个特殊的函数（叫“构造函数”），必须要前面配着&quot;new&quot;来用，而且会给你一个该类型的值。和函数一样，你也可以使用那个小黄框来看它的各种用法。</p><p>不过为什么要用这些别的类型呢？因为微软在这些类型内部封装了一些便利的功能，来帮助我们完成一些与它们有关的操作。专事专用，用日期专用的类型来处理日期就会方便很多。例如，如果我们要算两个日期之间差几天，如果你用 int 来表示每个的年月日，自己来算日期，就得自己处理进位借位（进到下个月，退到上个月）、每个月多少天、是不是闰年等麻烦事。但是微软的大佬们已经给我们预先准备好了日期减日期的运算程序。我们可以直接用：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">DateTime date1 = <span class="keyword">new</span> DateTime(<span class="number">2021</span>, <span class="number">12</span>, <span class="number">5</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>); <span class="comment">// 2021-12-5</span></span><br><span class="line">DateTime date2 = <span class="keyword">new</span> DateTime(<span class="number">2022</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>); <span class="comment">// 2022-6-7</span></span><br><span class="line">TimeSpan delta = date2 - date1;</span><br><span class="line"><span class="comment">// 这里用了微软在C#语言里面提前帮我们写好的 “日期 - 日期” 计算，它能自动处理好日期计算里的各种问题！完全不用咱自己动脑子</span></span><br><span class="line"><span class="comment">// TimeSpan 又是个新类型，它用来专门表示一个“时间差”。不需要记，这里只是拿来举例子</span></span><br><span class="line"><span class="comment">// 显然 日期 - 日期 得到一个“时间差”类型的结果，挺合理的</span></span><br><span class="line">Console.WriteLine(Convert.ToString(delta)); <span class="comment">// 而且ToString也支持TimeSpan类型</span></span><br></pre></td></tr></table></figure><p>当然，不是所有问题都有提前做好的解决程序（不然咱还学编程干嘛），不过要是有为啥不用呢？多方便。</p><h2 id="成员">成员</h2><p>接下来我们深入地讲一下上一节课讲到的成员访问（“.”）。<br>为了简便（以及与专有名词接轨）起见，我们从现在开始将某一个类型的值称为“对象”。对象这个词中文上可能相对不太好理解, 对象的英文是 <code>object</code>, 作为编程术语时翻译为对象, 它也有 “宾语”, &quot;物体&quot;的意思, 换句话说, 我们生活中能见到的非抽象的东西都可以叫对象。</p><p>如，上面这个例子中，<code>date1</code> 变量里储存了一个 <code>DateTime</code> 类型的对象。把它理解成“一个东西”即可。<br>成员可以理解为是一个对象“里面的”内容，可以使用&quot;.&quot;来获得或使用。例如：<code>Year</code> <code>Month</code> <code>Day</code> 都是 <code>DateTime</code> 的成员。在上面一个例子中，<code>date1.Year</code> 就会返回 <code>int</code> 类型的 2021，它是这个日期的“年”成份。</p><p>有些成员是“非静态”的。别被这个不知所云的名词吓倒，它的意思是，这个内容是和一个特定的对象相关的，而不是和这个类型的总体泛泛地相关的。也就是说，非静态的不是对于每个对象都一样的。而“静态”（就是我们之前看到的 <code>static</code> 修饰符）与之正相反，是一种总体的东西，与整个类型有关，和每个单独的对象没有关系。</p><p>好像有些不太好理解，我们举个例子。例如，刚才提到的<code>Year</code>就是<code>DateTime</code> 的非静态成员，因为不同的日期的值的年份可能不同。或者再举个例子，如果我们有一个“学生”类型，那么“班级”就是它的非静态成员，因为不同的学生可能在不同的班；但是“腿数”就可能是个静态成员，因为所有学生都是两条腿——当然在设计的时候把它做成非静态的也行，不过不太有必要。</p><p>如果要用一个非静态的成员，在一个值的后面加&quot;.“就可以访问到它了。例如上面的 <code>date1.Year</code> 就是获取了date1 这个对象 的 Year 成员。如果要用一个静态的成员，在类型名的后面加”.&quot;即可。如 <code>int.MaxValue</code> 就获取到了 <code>int</code> 类型所能表示的最大数值。您也想必很容易理解，“能表示的最大数值”这种东西一般是“静态”的。</p><p>您甚至可以套好几层的成员访问。用上面那个学生的例子就是：“小明.班.学生人数” 获得小明这个学生所在的班的学生人数。</p><p>成员不仅可以是值，还可以是函数。例如我们一直在用的 <code>Console.WriteLine</code> 就是 <code>Console</code> 类型的一个静态成员函数（您是直接用&quot;Console&quot;这个类型名，而不是在 new 一个 <code>Console</code> 对象来用的）。</p><p>您可能会说：不对呀，输出内容不是和特定的窗口相关的吗，为什么它是静态的呢？这是因为Windows系统规定每个程序只能有一个控制台窗口，所以既然只有一个为了方便起见就干脆搞成静态的了。</p><p>您应该已经感受到值和函数的区别还是挺大的，值可以直接用，但是函数就得加<code>()</code>来调用，有时候还得在括号里写参数。如何区分呢？</p><p>您可能已经注意到，当您打出一个&quot;.&quot;字时，SharpDevelop将自动弹出提示列表，里面就会列出它所有成员的名字。每个名字的左侧都有一个图标，形如“蓝色方块”和“手拿着表格”的分别是“成员变量”和“属性”，不用太计较它们的区别，它们都可以直接当作一个值来用，例如刚才的<code>date1.Year</code>。形如“紫色方块”的就是函数，它们要用括号来调用，例如<code>Console.WriteLine(...)</code>。</p><p>善用自动提示！SharpDevelop的提示功能与小黄框可以显示各个成员的名称、类型和用法，您几乎不用背诵任何内容。</p><h2 id="什么是-“null”？">什么是 “null”？</h2><p>在开始讲这一节之前，我们先来引入一个有趣的东西：随机数发生器。<br>这同样也是个类型——<code>Random</code>，一个 <code>Random</code> 的对象有一个叫 <code>Next</code> 的非静态成员函数，使用时需提供两个 int 类型参数分别表示最小和最大值（左闭右开），反复调用即可从里面不断取出不同的数。用来做猜数游戏想必很有趣。还是那句话，只是为了举例子，不用背。</p><p>假设我们想得到一个1~50的随机数，写了这样的代码：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Random rand;</span><br><span class="line">Console.WriteLine(rand.Next(<span class="number">1</span>, <span class="number">51</span>)); <span class="comment">// 左开右闭所以右边是51</span></span><br></pre></td></tr></table></figure><p>运行一下，报错了！出现了&quot;NullReferenceException&quot;（空引用错误）。这是为什么呢？</p><p>原来，<code>Random rand</code> 这样声明变量，只是创建了一个叫 rand 的，可以存储 Random 对象的“盒子”。rand的里面是空的，并没有把一个实际的 Random 随机数生成器对象“装”到里面。</p><p>当我们在 <code>rand.Next</code> 的时候，我们要把这个生成器从&quot;rand&quot;这个&quot;盒子&quot;拿出来让它给我们生成个随机数－－但rand里现在是空的，并没有一个生成器被装在里面。所以自然出现了问题。</p><p>那我们应该怎么做呢？我们要用某种方法获得一个生成器的对象（值），然后把它装到 rand 这个“盒子”里。怎么获得呢？还记得 new 运算符么？</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Random rand;</span><br><span class="line">rand = <span class="keyword">new</span> Random(); <span class="comment">// 用 new 运算符搞出一个Random对象来（Random类型构造函数不需参数）</span></span><br><span class="line">Console.WriteLine(rand.Next(<span class="number">1</span>, <span class="number">51</span>)); <span class="comment">// 现在rand已经“有对象”了，可以正常用了</span></span><br></pre></td></tr></table></figure><p>接下来介绍&quot;null&quot;。&quot;null&quot;是个特殊的值，表示“没有值（没有对象）”的这么一个状态。例如，最开始的时候，rand里没有对象（没有值），也可以说“rand的值是null”。<br>你还可以给变量赋值为null。这代表着把里面已经有的对象（如果有）给扔掉。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Random rand = <span class="keyword">new</span> Random(); <span class="comment">// 搞出来一个生成器搁进去</span></span><br><span class="line">rand = <span class="literal">null</span>; <span class="comment">// 又给扔了</span></span><br><span class="line">Console.WriteLine(rand.Next(<span class="number">1</span>, <span class="number">51</span>)); <span class="comment">// 又会报错了，因为已经给扔了，现在又没了</span></span><br></pre></td></tr></table></figure><p>类似的，如果想知道一个变量里面有没有正在存着一个值，可以使用 <code>rand == null</code>和<code>rand != null</code> 判断。</p><p>特殊的是，内置的 int 和 double （以及部分别的，如DateTime）是“值类型”。与刚刚的 random 的区别在于，一个值类型的变量（如<code>int a</code>）一被创建就会自动地装有一个对象（一般会是0）。可以把它修改成别的值（<code>a = ...</code>），但是不能扔掉（<code>a = null</code> 在编译时就会报错）。所以您永远都不会担心自己 int 类型的变量会是 null 。<br>相反的，大多数其他类型就都是可以为&quot;null&quot;的了（这种类型的学名叫“引用类型”），所以用的时候一定要注意。如果您不太拿得准，最好在声明变量的时候就用&quot;new&quot;搞个值出来赋给它。</p><p>string 是个有趣的例子，因为它也是个“引用类型”。也就是说，“” 是个空字符串， 而 null 则是“没有字符串”。</p><p>关于这个编程上有一个相关的非常形象的笑话：卫生间里挂厕纸的那个挂钩，字符串 <code>&quot;abc&quot;</code> 是挂钩上挂着一卷纸；<code>&quot;&quot;</code> 是挂钩上没纸了，但是还挂着那个硬质壳的芯；<code>null</code> 则是干脆钩上啥也没了。</p><p><img src="https://s6.jpg.cm/2021/12/09/LeBJee.jpg" alt="paper-and-null"></p><p>这也是要注意的一点。当访问 string 的成员时（string 有个叫 Length 的非静态属性，代表它的长度）：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> a = <span class="string">&quot;abc&quot;</span>; Console.WriteLine(a.Length); <span class="comment">// 输出 3</span></span><br><span class="line"><span class="built_in">string</span> b = <span class="string">&quot;&quot;</span>; Console.WriteLine(b.Length); <span class="comment">// 输出 0</span></span><br><span class="line"><span class="built_in">string</span> c; Console.WriteLine(c.Length); <span class="comment">// 不会输出0 － 程序会报错崩溃！</span></span><br></pre></td></tr></table></figure><p>因为c是null，所以试图访问<code>c.Length</code>会直接导致&quot;NullReferenceException&quot;错误。<br>当然，日常使用中我们不太会经常遇到&quot;null&quot;的string，所以不用过于担心；但您还是需要了解这种现象。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;本文主要由zbx1425大佬所写&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;再谈数据类型&quot;&gt;再谈数据类型&lt;/h2&gt;
&lt;p&gt;数据类型是一个初学者不太容易搞懂的概念，所以我们还要再强调一下。&lt;br&gt;
首先，C#中的每一个“值”都是有类型的。包</summary>
      
    
    
    
    <category term="c#" scheme="https://blog.satori-march.top/categories/csharp/"/>
    
    <category term="电子电路社" scheme="https://blog.satori-march.top/categories/%E7%94%B5%E5%AD%90%E7%94%B5%E8%B7%AF%E7%A4%BE/"/>
    
    <category term="c#教程" scheme="https://blog.satori-march.top/categories/csharp/charp-tutorial/"/>
    
    
    <category term="c#" scheme="https://blog.satori-march.top/tags/csharp/"/>
    
  </entry>
  
  <entry>
    <title>C#基础教程[2] 循环程序设计</title>
    <link href="https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[2]%E5%BE%AA%E7%8E%AF%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    <id>https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[2]%E5%BE%AA%E7%8E%AF%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/</id>
    <published>2021-11-29T00:00:00.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<p>之前学的程序里的语句都只能执行最多一次, 无法发挥出计算机的优势. 而为了让代码中的一行语句可以被执行若干遍, 于是便有了循环.</p><h2 id="循环语句">循环语句</h2><h3 id="while-循环"><code>while</code> 循环</h3><p>假设我们要写一个程序永远不停的输出 <code>hello world</code> (直到你关掉这个程序), 代码如下:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line"> Console.WriteLine(<span class="string">&quot;hello world&quot;</span>);    </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>其中小括号里的为条件, 大括号里的(即这个代码块)为参与循环的部分<br>在进入循环之前会先判断括号里的条件，如果为 <code>true</code> 才执行，每次执行完大括号里的内容会再次判断括号里的条件，如果为 <code>true</code> 则再次执行大括号里的内容，循环往复直到括号里的条件为 <code>false</code></p><p>因为上面的例子中括号里恒为 <code>true</code> 所以这个循环会永远进行下去</p><div class="note warning flat"><p>不能写成 <code>while(1)</code>, 当你了解了 <code>C#</code> 中的数据类型转换机制的时候你会对此有更深的感悟</p></div><p>再举一个不是死循环的例子：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">while</span> (a &lt; <span class="number">10</span>) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;a 的值: &#123;0&#125;&quot;</span>, a);</span><br><span class="line">    a++;  <span class="comment">// 自增运算符, 相当于 a = a + 1;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>大家可以预测一下输出的结果。</p><details class="toggle" ><summary class="toggle-button" style="">点我查看输出结果</summary><div class="toggle-content"><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">a 的值: 5</span><br><span class="line">a 的值: 6</span><br><span class="line">a 的值: 7</span><br><span class="line">a 的值: 8</span><br><span class="line">a 的值: 9</span><br></pre></td></tr></table></figure></div></details><h4 id="猜数游戏">猜数游戏</h4><p>在这里先介绍一下如何生成随机数：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Random rd = <span class="keyword">new</span> Random();  <span class="comment">// 如果要生成多组随机数 这行也只需要在最开始写一遍</span></span><br><span class="line"><span class="built_in">int</span> a = rd.Next();  <span class="comment">// Next()函数返回下一个随机数</span></span><br></pre></td></tr></table></figure><p>这么写具体的原理会在下一节进行解释</p><p>如果要生成指定范围内的随机数应该写为：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rd.Next(<span class="number">5</span>, <span class="number">11</span>);  <span class="comment">// 左闭右开，所以此处为 [5,11) 范围内的随机数，并不包括 11</span></span><br></pre></td></tr></table></figure><p>这样我们就可以写一个猜数游戏了：生成 [1,100] 内的一个随机数，让玩家来猜这个数的大小，提示玩家猜测的数是偏大还是偏小，直到玩家猜中</p><p>代码：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">Random rd = <span class="keyword">new</span> Random();</span><br><span class="line"><span class="built_in">int</span> a = rd.Next(<span class="number">1</span>, <span class="number">101</span>);</span><br><span class="line"></span><br><span class="line">Console.WriteLine(<span class="string">&quot;输入你猜测的数字:&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">int</span> num = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span>(num != a) &#123;</span><br><span class="line">    <span class="keyword">if</span> (num &lt; a) &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;不对不对, 太小了&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;不对不对, 太大了&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;再猜一次吧:&quot;</span>);</span><br><span class="line">    num = Convert.ToInt32(Console.ReadLine());</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(<span class="string">&quot;恭喜你猜对了!&quot;</span>);</span><br></pre></td></tr></table></figure><h4 id="例题-2-1-竞选社长">例题 2-1 <a href="https://www.nowcoder.com/practice/45a30e3ef51040ed8a7674984d6d1553?tpId=107&amp;&amp;tqId=33321&amp;rp=1&amp;ru=/ta/beginner-programmers&amp;qru=/ta/beginner-programmers/question-ranking">竞选社长</a></h4><p>假设电子电路社要竞选下一届社长，有两名候选人分别是A和B，社团每名同学必须并且只能投一票，最终得票多的人为社长.</p><p>输入包含若干行的字符，每行仅包含A或B，输入以字符0结束。（原题为一行字符序列）</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> str = Console.ReadLine();</span><br><span class="line"><span class="built_in">int</span> a=<span class="number">0</span>, b=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(str != <span class="string">&quot;0&quot;</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (str == <span class="string">&quot;A&quot;</span>) &#123;</span><br><span class="line">        a++;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> &#123;</span><br><span class="line">        b++;</span><br><span class="line">    &#125;</span><br><span class="line">    str = Console.ReadLine();  <span class="comment">// 不要忘记重新读取下一行</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (a &gt; b) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;A&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (a &lt; b) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;B&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;E&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="for-循环"><code>for</code> 循环</h3><p>以下代码列是一个简单的 <code>for</code> 语句，它循环遍历其代码块（即被大括号括起来的内容）十次，并打印 <code>i</code> 的当前值。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i=<span class="number">0</span>; i &lt; <span class="number">10</span>; i++) &#123;</span><br><span class="line">  Console.WriteLine(<span class="string">&quot;i的值为: &#123;0&#125;&quot;</span>, i);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>大括号包起来的代码块部分很好理解，让我们来看看小括号里的内容：</p><p>小括号里被分号 <code>;</code> 分为三个部分，分别表示：</p><ol><li>在进入循环语句和判断条件之前执行的语句，无论循环是否执行这个语句都只会被执行一次</li><li>循环判断的条件，与 <code>while</code> 语句同理</li><li>每次执行完大括号里的内容之后执行的语句，注意是在执行完该语句之后才会再次判断条件</li></ol><p>刚刚的学习 <code>while</code> 循环时展示的代码可以用 <code>for</code> 循环更简单的写出来：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> a=<span class="number">5</span>; a &lt; <span class="number">10</span>; a++) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;a 的值: &#123;0&#125;&quot;</span>, a);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>再对比刚刚的代码看：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>;  <span class="comment">// 被小括号里的第一部分代替</span></span><br><span class="line"><span class="keyword">while</span> (a &lt; <span class="number">10</span>) &#123;  <span class="comment">// 被小括号里的第二部分代替</span></span><br><span class="line">    Console.WriteLine(<span class="string">&quot;a 的值: &#123;0&#125;&quot;</span>, a);</span><br><span class="line">    a++;  <span class="comment">// 被小括号里的第三部分代替</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意小括号里第一部分写为 <code>int a</code> 和在循环外写 <code>int a</code> 的区别：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> a=<span class="number">5</span>; a &lt; <span class="number">10</span>; a++) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;a 的值: &#123;0&#125;&quot;</span>, a);</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(a);  <span class="comment">// 会报错告诉你 a 没有定义</span></span><br></pre></td></tr></table></figure><p>换句话说在括号里定义的 <code>a</code> 就只会在循环的范围内生效</p><p>如果想使用 a 的值请像下面这么写：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a;</span><br><span class="line"><span class="keyword">for</span> (a=<span class="number">5</span>; a &lt; <span class="number">10</span>; a++) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;a 的值: &#123;0&#125;&quot;</span>, a);</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(a);  <span class="comment">// 正常执行，输出10</span></span><br></pre></td></tr></table></figure><p>也请注意最后 <code>a</code> 的值为 10 而不是 9。考虑反证法，如果 a 为 9 则还满足循环的条件，则会继续执行循环的内容，所以 a 一定不是 9</p><h4 id="例题-2-2-FizzBuzz-问题">例题 2-2 FizzBuzz 问题</h4><p>每行输出一个数字 从 1 到 100，满足以下规则：</p><ul><li>如果当前值可被 3 整除，则在该数字旁打印 Fizz。</li><li>如果当前值可被 5 整除，则在该数字旁打印 Buzz。</li><li>如果当前值可 同时 被 3 和 5 整除，则在该数字旁打印 FizzBuzz。</li></ul><p>例如:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">1</span><br><span class="line">2       </span><br><span class="line">3 - Fizz</span><br><span class="line">4       </span><br><span class="line">5 - Buzz</span><br><span class="line">6 - Fizz</span><br><span class="line">7       </span><br><span class="line">8</span><br><span class="line">9 - Fizz</span><br><span class="line">10 - Buzz</span><br><span class="line">11</span><br><span class="line">12 - Fizz</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15 - FizzBuzz</span><br></pre></td></tr></table></figure><p>示例程序：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 注意这里用的是 &lt;= , 如果想模仿上面的例子使用 &lt;, 请把100 改为 101</span></span><br><span class="line"><span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">1</span>; i &lt;= <span class="number">100</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (i % <span class="number">3</span> == <span class="number">0</span> &amp;&amp; i % <span class="number">5</span> == <span class="number">0</span>) &#123;  <span class="comment">// 如果同时能被 3 和 5 整除执行</span></span><br><span class="line">        Console.WriteLine(<span class="string">&quot;&#123;0&#125; - FizzBuzz&quot;</span>, i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// 注意 else, 不能被同时整除的时候却能被 3 整除才执行</span></span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (i % <span class="number">3</span> == <span class="number">0</span>) &#123; </span><br><span class="line">        Console.WriteLine(<span class="string">&quot;&#123;0&#125; - Fizz&quot;</span>, i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// 同样注意 else, 不能被同时整除 也不能被 3 整除 却能被 5 整除执行</span></span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (i % <span class="number">5</span> == <span class="number">0</span>) &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;&#123;0&#125; - Buzz&quot;</span>, i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> &#123;  <span class="comment">// 上述情况都不满足说明不能被任何一个整除</span></span><br><span class="line">        Console.WriteLine(i);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>无代码注释版：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">1</span>; i &lt;= <span class="number">100</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (i % <span class="number">3</span> == <span class="number">0</span> &amp;&amp; i % <span class="number">5</span> == <span class="number">0</span>) &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;&#123;0&#125; - FizzBuzz&quot;</span>, i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (i % <span class="number">3</span> == <span class="number">0</span>) &#123; </span><br><span class="line">        Console.WriteLine(<span class="string">&quot;&#123;0&#125; - Fizz&quot;</span>, i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (i % <span class="number">5</span> == <span class="number">0</span>) &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;&#123;0&#125; - Buzz&quot;</span>, i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> &#123;</span><br><span class="line">        Console.WriteLine(i);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>请注意括号里三个部分不同就会导致循环不同的结果：(注释为循环时 <code>i</code> 的范围)</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i=<span class="number">1</span>; i &lt;= <span class="number">10</span>; i++) &#123;  &#125;  <span class="comment">// [1,10]</span></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i=<span class="number">1</span>; i &lt; <span class="number">10</span>; i++) &#123;  &#125;  <span class="comment">// [1,9]</span></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i=<span class="number">0</span>; i &lt;= <span class="number">10</span>; i++) &#123;  &#125;  <span class="comment">// [0, 10]</span></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i=<span class="number">10</span>; i &gt;= <span class="number">1</span>; i--) &#123;  &#125;  <span class="comment">// [1,10] 逆序</span></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i=<span class="number">10</span>; i &gt; <span class="number">1</span>; i--) &#123;  &#125;  <span class="comment">// [2,10] 逆序</span></span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i=<span class="number">1</span>; i &lt;= <span class="number">10</span>; i += <span class="number">2</span>) &#123;  &#125;  <span class="comment">// &#123;1, 3, 5, 7, 9&#125;</span></span><br></pre></td></tr></table></figure><h3 id="嵌套循环">嵌套循环</h3><p>循环是可以嵌套的，当出现嵌套循环的时候，先执行内层循环，内层循环执行完一遍之后再回到外层的循环，再从外层循环进入内层循环，类似数学中的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∑</mo><mo>∑</mo></mrow><annotation encoding="application/x-tex">\sum\sum</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑∑</span></span></span></span>，又类似平常说的“先从上到下 再从左到右”也可以理解为嵌套循环。让我们看一个例子：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">5</span>; i &lt; <span class="number">10</span>; i++) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;i 的值: &#123;0&#125;&quot;</span>, i);</span><br><span class="line">    <span class="keyword">for</span>(<span class="built_in">int</span> j=<span class="number">5</span>; j &lt; <span class="number">8</span>; j++) &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;    j 的值: &#123;0&#125;&quot;</span>, j);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><div class="note danger flat"><p>请注意在嵌套循环的时候两个变量 <code>i</code> 和 <code>j</code> 不要错写成一样的，会引起混淆，就像一个班里有两个人都叫小明的时候你直接喊“小明”会不知道你指的是谁。</p></div><details class="toggle" ><summary class="toggle-button" style="">输出</summary><div class="toggle-content"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">i 的值: 5</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br><span class="line">    j 的值: 7</span><br><span class="line">i 的值: 6</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br><span class="line">    j 的值: 7</span><br><span class="line">i 的值: 7</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br><span class="line">    j 的值: 7</span><br><span class="line">i 的值: 8</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br><span class="line">    j 的值: 7</span><br><span class="line">i 的值: 9</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br><span class="line">    j 的值: 7</span><br></pre></td></tr></table></figure></div></details><h4 id="例题-2-3-等腰直角三角形">例题 2-3 <a href="https://www.nowcoder.com/practice/2cdea429fa414fbba26e6c821724ca06?tpId=107&amp;&amp;tqId=33340&amp;rp=1&amp;ru=/ta/beginner-programmers&amp;qru=/ta/beginner-programmers/question-ranking">等腰直角三角形</a></h4><p>KiKi学习了循环，BoBo老师给他出了一系列打印图案的练习，该任务是打印用“*”组成的翻转直角三角形图案。(原题为多组数据，这里简化为一组)</p><p>输入一个数字即等腰直角三角形的侧边长，当输入为 5 时输出如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">* * * * *</span><br><span class="line">* * * * </span><br><span class="line">* * *</span><br><span class="line">* *</span><br><span class="line">*</span><br></pre></td></tr></table></figure><p>示例代码：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> n = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"><span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="built_in">int</span> j=i; j &lt;= n; j++) &#123;  <span class="comment">// 注意这里 j 的初始值设为 i, 这样才能每次输出星号个数递减</span></span><br><span class="line">        Console.Write(<span class="string">&quot;* &quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    Console.WriteLine();  <span class="comment">// 输出换行</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="循环控制语句">循环控制语句</h3><div class="note info flat"><p>以下内容对 <code>for</code> 和 <code>while</code> 均适用</p></div><h4 id="break-语句"><code>break</code> 语句</h4><p><code>break</code> 表示终止循环，当在循环里遇到 <code>break</code> 语句时，循环会立即终止，且程序流将继续执行紧接着循环语句之后的语句。例如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">5</span>; i &lt; <span class="number">10</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (i == <span class="number">8</span>) <span class="keyword">break</span>;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;i 的值: &#123;0&#125;&quot;</span>, i);</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(<span class="string">&quot;end loop&quot;</span>);</span><br></pre></td></tr></table></figure><details class="toggle" ><summary class="toggle-button" style="">输出</summary><div class="toggle-content"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">i 的值: 5</span><br><span class="line">i 的值: 6</span><br><span class="line">i 的值: 7</span><br><span class="line">end loop</span><br></pre></td></tr></table></figure></div></details><p>当 <code>break</code> 语句用在嵌套循环中，只会跳出最内层的循环，例如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">5</span>; i &lt; <span class="number">10</span>; i++) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;i 的值: &#123;0&#125;&quot;</span>, i);</span><br><span class="line">    <span class="keyword">for</span> (<span class="built_in">int</span> j=<span class="number">5</span>; j &lt; <span class="number">9</span>; j++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (j == <span class="number">7</span>) <span class="keyword">break</span>;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;    j 的值： &#123;0&#125;&quot;</span>, j);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><details class="toggle" ><summary class="toggle-button" style="">输出</summary><div class="toggle-content"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">i 的值: 5</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br><span class="line">i 的值: 6</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br><span class="line">i 的值: 7</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br><span class="line">i 的值: 8</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br><span class="line">i 的值: 9</span><br><span class="line">    j 的值: 5</span><br><span class="line">    j 的值: 6</span><br></pre></td></tr></table></figure></div></details><h4 id="continue-语句"><code>continue</code> 语句</h4><p><code>continue</code> 语句与 <code>break</code> 语句类似，但 <code>continue</code> 语句的意思是 停止当前循环体里语句的执行，跳到循环的开始，（对于 <code>for</code> 循环）执行括号里第三部分的语句，然后重新判断循环条件决定是否继续循环。</p><p>例如把上面的例子中的 <code>break</code> 改成 <code>continue</code>：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">5</span>; i &lt; <span class="number">10</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (i == <span class="number">8</span>) <span class="keyword">continue</span>;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;i 的值: &#123;0&#125;&quot;</span>, i);</span><br><span class="line">&#125;</span><br><span class="line">Console.WriteLine(<span class="string">&quot;end loop&quot;</span>);</span><br></pre></td></tr></table></figure><details class="toggle" ><summary class="toggle-button" style="">输出</summary><div class="toggle-content"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">i 的值: 5</span><br><span class="line">i 的值: 6</span><br><span class="line">i 的值: 7</span><br><span class="line">i 的值: 9</span><br><span class="line">end loop</span><br></pre></td></tr></table></figure></div></details><p>注意这里跳过了 <code>i = 8</code> 时的情况直接输出了 <code>i = 9</code> 的情况</p><h2 id="练习">练习</h2><h3 id="2-1-阶乘-P5739">2-1 阶乘  (P5739)</h3><p>输入 <code>n</code>, 输出 <code>n</code> 的阶乘(n &lt;= 12)</p><h3 id="2-2-aabb">2-2 aabb</h3><p>输出所有形如 aabb 的完全平方数</p><h3 id="2-3-最高分与最低分之差">2-3 最高分与最低分之差</h3><p>第一行输入一个数 n, 然后n行每行一个整数代表一个人的成绩, 求出最高分和最低分的差值</p><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">输入</button><button type="button" class="tab">输出</button></div><div class="tab-contents"><div class="tab-item-content active"><p>5<br>98<br>100<br>99<br>97<br>95</p></div><div class="tab-item-content"><p>5</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h3 id="2-4-RPG游戏">2-4 <a href="https://docs.microsoft.com/zh-cn/learn/modules/csharp-do-while/3-challenge">RPG游戏</a></h3><p>在大部分角色扮演游戏中，玩家角色会与NPC战斗。在此练习中，我们归纳出战斗过程的本质。 英雄和怪物在开始时的生命值相同。 在英雄攻击时，它们将生成一个随机值，该值将从怪物的生命值中减去。 如果怪物的生命值大于零，则会轮到它们攻击英雄。 只要英雄和怪物的生命值都大于零，战斗就会继续进行。</p><p>为游戏实现以下规则：</p><h4 id="游戏规则">游戏规则</h4><ul><li>英雄和怪物在开始时的生命值为 10。</li><li>所有攻击都是介于 1 到 10 之间的随机值。</li><li>英雄首先攻击。</li><li>输出怪物损失的生命值，以及剩余的生命值。</li><li>如果怪物的生命值大于 0，则它会攻击英雄。</li><li>输出英雄损失的生命值，以及剩余的生命值。</li><li>继续此攻击顺序，直到怪物或英雄任意一方的生命值为零或更低。</li><li>输出胜利者。</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;之前学的程序里的语句都只能执行最多一次, 无法发挥出计算机的优势. 而为了让代码中的一行语句可以被执行若干遍, 于是便有了循环.&lt;/p&gt;
&lt;h2 id=&quot;循环语句&quot;&gt;循环语句&lt;/h2&gt;
&lt;h3 id=&quot;while-循环&quot;&gt;&lt;code&gt;while&lt;/code&gt; 循环&lt;/h3&gt;</summary>
      
    
    
    
    <category term="c#" scheme="https://blog.satori-march.top/categories/csharp/"/>
    
    <category term="电子电路社" scheme="https://blog.satori-march.top/categories/%E7%94%B5%E5%AD%90%E7%94%B5%E8%B7%AF%E7%A4%BE/"/>
    
    <category term="c#教程" scheme="https://blog.satori-march.top/categories/csharp/charp-tutorial/"/>
    
    
    <category term="c#" scheme="https://blog.satori-march.top/tags/csharp/"/>
    
  </entry>
  
  <entry>
    <title>test</title>
    <link href="https://blog.satori-march.top/posts/blog/test/"/>
    <id>https://blog.satori-march.top/posts/blog/test/</id>
    <published>2021-11-28T00:00:00.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<h1>一级标题</h1><h2 id="二级标题">二级标题</h2><h3 id="三级标题">三级标题</h3><h4 id="四级标题">四级标题</h4><h5 id="五级标题">五级标题</h5><h6 id="六级标题">六级标题</h6><blockquote><p>提示块标签</p><blockquote><p>嵌套提示块</p></blockquote></blockquote><ul><li>无序列表1</li><li>无序列表2</li></ul><ol><li>有序列表1</li><li>有序列表2</li></ol><p><strong>加粗</strong>，<em>斜体</em>，<s>删除线</s>，<u>下划线</u>。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;hello world&quot;</span>);</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cout &lt;&lt; <span class="string">&quot;hello world&quot;</span>;</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">System.out.println(<span class="string">&quot;hello world&quot;</span>);</span><br></pre></td></tr></table></figure><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Console.WriteLine(<span class="string">&quot;hello world&quot;</span>);</span><br></pre></td></tr></table></figure><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><munder><mo>⋃</mo><mi>n</mi></munder><msub><mi>S</mi><mi>n</mi></msub><msup><mo stretchy="false">)</mo><mi>c</mi></msup><mo>=</mo><munder><mo>⋂</mo><mi>n</mi></munder><msubsup><mi>S</mi><mi>n</mi><mi>c</mi></msubsup></mrow><annotation encoding="application/x-tex">(\bigcup_{n}S_{n}) ^{c} =\bigcap_{n}S^{c}_{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.3em;vertical-align:-1.25em;"></span><span class="mopen">(</span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.9em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">⋃</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.25em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.3em;vertical-align:-1.25em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.9em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">⋂</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.25em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-2.453em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.16em" columnspacing="1em"><mtr><mtd class ="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mi>x</mi><mo>=</mo><msub><mi>a</mi><mn>0</mn></msub><mo>+</mo><mfrac><mn>1</mn><mrow><msub><mi>a</mi><mn>1</mn></msub><mo>+</mo><mfrac><mn>1</mn><mrow><msub><mi>a</mi><mn>2</mn></msub><mo>+</mo><mfrac><mn>1</mn><mrow><msub><mi>a</mi><mn>3</mn></msub><mo>+</mo><mfrac><mn>1</mn><msub><mi>a</mi><mn>4</mn></msub></mfrac></mrow></mfrac></mrow></mfrac></mrow></mfrac></mrow></mstyle></mtd><mtd class ="mtr-glue"></mtd><mtd class ="mml-eqn-num"></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{equation}  x = a_0 + \cfrac{1}{a_1           + \cfrac{1}{a_2           + \cfrac{1}{a_3 + \cfrac{1}{a_4} } } }\end{equation}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:6.866em;vertical-align:-3.183em;"></span><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.683em;"><span style="top:-5.683em;"><span class="pstrut" style="height:3.59em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.59em;"><span style="top:-2.11em;"><span class="pstrut" style="height:3.59em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.59em;"><span style="top:-2.11em;"><span class="pstrut" style="height:3.59em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.59em;"><span style="top:-2.11em;"><span class="pstrut" style="height:3.59em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.59em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.74em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span></span></span></span></span><span style="top:-3.82em;"><span class="pstrut" style="height:3.59em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-4.33em;"><span class="pstrut" style="height:3.59em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.316em;"><span></span></span></span></span></span><span></span></span></span></span><span style="top:-3.82em;"><span class="pstrut" style="height:3.59em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-4.33em;"><span class="pstrut" style="height:3.59em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.796em;"><span></span></span></span></span></span><span></span></span></span></span><span style="top:-3.82em;"><span class="pstrut" style="height:3.59em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-4.33em;"><span class="pstrut" style="height:3.59em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:5.276em;"><span></span></span></span></span></span><span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.183em;"><span></span></span></span></span></span></span></span><span class="tag"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.683em;"><span style="top:-5.683em;"><span class="pstrut" style="height:3.59em;"></span><span class="eqn-num"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.183em;"><span></span></span></span></span></span></span></span></span></p><p>试试行内公式 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>e</mi><mrow><mi>i</mi><mi>x</mi></mrow></msup><mo>=</mo><mi>cos</mi><mo>⁡</mo><mi>x</mi><mo>+</mo><mi>i</mi><mo>⋅</mo><mi>sin</mi><mo>⁡</mo><mi>x</mi></mrow><annotation encoding="application/x-tex">e^{ix} = \cos x + i \cdot \sin x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8247em;"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8247em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight">x</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mop">cos</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6679em;"></span><span class="mop">sin</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">x</span></span></span></span></p><p><a href="%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E8%84%9A%E6%B3%A8">^这是脚注</a></p><p>这也是脚注<a href="%E8%BF%99%E6%98%AF%E8%84%9A%E6%B3%A81">^1</a></p><table><thead><tr><th>title</th><th style="text-align:left">an English long long title</th><th>一个中文长长长长标题~</th></tr></thead><tbody><tr><td>content</td><td style="text-align:left">Lorem ipsum dolor sit amet, consectetur adipisicing elit</td><td>中文内容</td></tr><tr><td><strong>markdown</strong><s>测试</s></td><td style="text-align:left">公式测试: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>=</mo><msup><mi>a</mi><mn>2</mn></msup><mo>+</mo><mn>2</mn><mi>a</mi><mi>b</mi><mo>+</mo><msup><mi>b</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">(a+b)^2=a^2+2ab+b^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mord mathnormal">ab</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></td><td>使用HTML 转义字符如: | (<code>&amp;#124;</code>)</td></tr></tbody></table><hr><h1>butterfly主题自带 tag plugins</h1><blockquote><p>以下部分的<a href="https://butterfly.js.org/posts/4aa8abbe/#%E6%A8%99%E7%B1%A4%E5%A4%96%E6%8E%9B%EF%BC%88Tag-Plugins%EF%BC%89">来源和详细使用方法</a></p></blockquote><h2 id="label">label</h2><mark class="hl-label red">这是红色</mark><mark class="hl-label pink">这是粉色</mark><mark class="hl-label orange">这是橙色</mark><mark class="hl-label yellow">这是黄色</mark><mark class="hl-label blue">这是蓝色</mark><mark class="hl-label green">这是绿色</mark><mark class="hl-label purple">这是紫色</mark><mark class="hl-label default">这是灰色</mark><hr><h2 id="note">note</h2><div class="note icon-padding flat"><i class="note-icon fab fa-cc-visa"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note blue icon-padding flat"><i class="note-icon fas fa-bullhorn"></i><p>2021年快到了…</p></div><div class="note pink icon-padding flat"><i class="note-icon fas fa-car-crash"></i><p>小心开车 安全至上</p></div><div class="note red icon-padding flat"><i class="note-icon fas fa-fan"></i><p>这是三片呢？还是四片？</p></div><div class="note orange icon-padding flat"><i class="note-icon fas fa-battery-half"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note purple icon-padding flat"><i class="note-icon far fa-hand-scissors"></i><p>剪刀石头布</p></div><div class="note green icon-padding flat"><i class="note-icon fab fa-internet-explorer"></i><p>前端最讨厌的浏览器</p></div><hr><div class="note flat"><p>默认 提示块标签</p></div><div class="note default flat"><p>default 提示块标签</p></div><div class="note primary flat"><p>primary 提示块标签</p></div><div class="note success flat"><p>success 提示块标签</p></div><div class="note info flat"><p>info 提示块标签</p></div><div class="note warning flat"><p>warning 提示块标签</p></div><div class="note danger flat"><p>danger 提示块标签</p></div><hr><h2 id="button">button</h2><a class="btn-beautify larger" href="https://butterfly.js.org/" title="Butterfly"><i class="far fa-hand-point-right"></i><span>Butterfly</span></a><a class="btn-beautify blue larger" href="https://butterfly.js.org/" title="Butterfly"><i class="far fa-hand-point-right"></i><span>Butterfly</span></a><a class="btn-beautify pink larger" href="https://butterfly.js.org/" title="Butterfly"><i class="far fa-hand-point-right"></i><span>Butterfly</span></a><a class="btn-beautify red larger" href="https://butterfly.js.org/" title="Butterfly"><i class="far fa-hand-point-right"></i><span>Butterfly</span></a><a class="btn-beautify purple larger" href="https://butterfly.js.org/" title="Butterfly"><i class="far fa-hand-point-right"></i><span>Butterfly</span></a><a class="btn-beautify orange larger" href="https://butterfly.js.org/" title="Butterfly"><i class="far fa-hand-point-right"></i><span>Butterfly</span></a><a class="btn-beautify green larger" href="https://butterfly.js.org/" title="Butterfly"><i class="far fa-hand-point-right"></i><span>Butterfly</span></a><h2 id="tab">tab</h2><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">test1 1</button><button type="button" class="tab">test1 2</button><button type="button" class="tab">test1 3</button></div><div class="tab-contents"><div class="tab-item-content active"><p><strong>This is Tab 1.</strong></p></div><div class="tab-item-content"><p><strong>This is Tab 2.</strong></p></div><div class="tab-item-content"><p><strong>This is Tab 3.</strong></p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">第一個Tab</button><button type="button" class="tab"><i class="fab fa-apple-pay"></i></button><button type="button" class="tab"><i class="fas fa-bomb"></i>炸彈</button></div><div class="tab-contents"><div class="tab-item-content active"><p><strong>tab名字為第一個Tab</strong></p></div><div class="tab-item-content"><p><strong>只有圖標 沒有Tab名字</strong></p></div><div class="tab-item-content"><p><strong>名字+icon</strong></p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><hr><h2 id="hide-toggle">hide toggle</h2><details class="toggle" ><summary class="toggle-button" style="">Butterfly安裝方法</summary><div class="toggle-content"><p>在你的博客根目錄裏</p><p>git clone -b master <a href="https://github.com/jerryc127/hexo-theme-butterfly.git">https://github.com/jerryc127/hexo-theme-butterfly.git</a> themes/Butterfly</p><p>如果想要安裝比較新的dev分支，可以</p><p>git clone -b dev <a href="https://github.com/jerryc127/hexo-theme-butterfly.git">https://github.com/jerryc127/hexo-theme-butterfly.git</a> themes/Butterfly</p></div></details><hr><h2 id="timeline">timeline</h2><div class="timeline "><div class='timeline-item headline'>        <div class='timeline-item-title'>          <div class='item-circle'><p>2022</p></div>        </div>      </div><div class='timeline-item'>        <div class='timeline-item-title'>          <div class='item-circle'><p>01-02</p></div>        </div>        <div class='timeline-item-content'><p>测试1</p></div>      </div><div class='timeline-item'>        <div class='timeline-item-title'>          <div class='item-circle'><p>02-03</p></div>        </div>        <div class='timeline-item-content'><p>测试2</p></div>      </div></div><hr><div class="timeline orange"><div class='timeline-item headline'>        <div class='timeline-item-title'>          <div class='item-circle'><p>2022</p></div>        </div>      </div><div class='timeline-item'>        <div class='timeline-item-title'>          <div class='item-circle'><p>01-02</p></div>        </div>        <div class='timeline-item-content'><p>這是測試頁面</p></div>      </div></div><h2 id="flink">flink</h2><div class="flink"><div class="flink-name">網站</div><div class="flink-desc">值得推薦的網站</div><div class="flink-list">      <div class="flink-list-item">        <a href="https://www.youtube.com/" title="Youtube" target="_blank">          <div class="flink-item-icon">            <img class="no-lightbox" src="https://i.loli.net/2020/05/14/9ZkGg8v3azHJfM1.png" onerror='this.onerror=null;this.src="/img/friend_404.gif"' alt="Youtube" />          </div>          <div class="flink-item-name">Youtube</div>          <div class="flink-item-desc" title="視頻網站">視頻網站</div>        </a>      </div>      <div class="flink-list-item">        <a href="https://twitter.com/" title="Twitter" target="_blank">          <div class="flink-item-icon">            <img class="no-lightbox" src="https://i.loli.net/2020/05/14/5VyHPQqR6LWF39a.png" onerror='this.onerror=null;this.src="/img/friend_404.gif"' alt="Twitter" />          </div>          <div class="flink-item-name">Twitter</div>          <div class="flink-item-desc" title="社交分享平台">社交分享平台</div>        </a>      </div></div></div><hr><h1>html 用法</h1><blockquote><p>以下文本和修改自这个人的 <code>typora</code> 主题的<a href="https://typora-dyzj-theme.vercel.app/#ref-footnote-1">demo</a></p></blockquote><p><kbd>ctrl</kbd>键</p><p>可以通过设置 <code>background-color</code>属性控制背景色，如：<code>&lt;font style=&quot;background-color:#8bc34a&quot;&gt;</code>绿色小标签<code>&lt;/font&gt;</code></p><p><a href="#%E4%BA%8C%E7%BA%A7%E6%A0%87%E9%A2%98">跳转</a>至指定标题（锚点），也可以在任意位置通过 <code>&lt;a name=&quot;锚点名&quot; alt=&quot;none&quot;&gt; &lt;/a&gt;</code>（为了方便编辑，typora会显示空标签或 <code>style=&quot;display:none&quot;</code>的标签，但填充一个空格就可以被隐藏，在导出为HTML文件时，由于该款超链接样式有一个padding宽度，所以空链接还是会显示下划线，<code>alt=&quot;none&quot;</code>用于避免该问题，如果自定义的锚点有文字说明，则不要使用 <code>alt=&quot;none&quot;</code>）设定锚点，示例：<a href="#star">求点个赞呗</a></p><p><a href="#" alt="null">无样式链接</a>，主要用于图片超链接，如：<a href="#" alt="null"><img src="https://img.shields.io/badge/-GitHub-181717?style=flat-square&logo=github"><img src="https://img.shields.io/badge/-Git-F05032?style=flat-square&logo=git&logoColor=white"></a></p><p><ruby>Base<rp> (</rp><rt>top</rt><rp>) </rp></ruby>、<ruby>佐天泪子<rp> (</rp><rt>xiān qún kuáng mó</rt><rp>) </rp></ruby>、<ruby>超電磁砲<rp> (</rp><rt>レールガン</rt><rp>) </rp></ruby></p><audio controls="controls">  <source src="/music/parsley.mp3" type="audio/mp3" /></audio><blockquote><p>可以将 <code>&lt;audio&gt;</code>音频包裹在 <code>&lt;center&gt;&lt;/center&gt;</code>中居中显示</p></blockquote><p>插入网易云的外链播放器（<code>&lt;iframe&gt;</code>，可嵌入油管等平台视频）：</p><iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="https://music.163.com/outchain/player?type=2&id=1836421270&auto=1&height=66"></iframe><details>    <summary>折叠标签</summary>    青青子衿，悠悠我心</details><p><a href="https://www.webfx.com/tools/emoji-cheat-sheet/">Emoji表情符号</a>：😄（<code>:smile:</code>），Decimal NCRs或Hexadecimal NCRs^[2]^编码也是受支持的，譬如“笑哭”：😂（<code>&amp;#128514;</code>）或😂（<code>&amp;#x1F602;</code>）</p><hr><video src="\video\club.mp4" controls="controls" style="max-width: 100%; display: block; margin-left: auto; margin-right: auto;">your browser does not support the video tag</video><hr><h1>Tag Plugins Plus</h1><h2 id="link">link</h2><p>插件作者:</p><div class="tag link"><a class="link-card" title="Akilar" href="https://akilar.top/posts/615e2dec"><div class="left"><img src="https://npm.elemecdn.com/akilar-candyassets/image/siteicon/favicon.ico"/></div><div class="right"><p class="text">Akilar</p><p class="url">https://akilar.top/posts/615e2dec</p></div></a></div><h2 id="行内文本样式-text">行内文本样式 text</h2><emp>着重号</emp><wavy>波浪线</wavy><h2 id="复选列表-checkbox">复选列表 checkbox</h2><div class='checkbox'><input type="checkbox" />            <p>纯文本测试</p>            </div><div class='checkbox checked'><input type="checkbox" checked="checked"/>            <p>支持简单的 <a href="https://guides.github.com/features/mastering-markdown/">markdown</a> 语法</p>            </div><div class='checkbox red'><input type="checkbox" />            <p>支持自定义颜色</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>绿色 + 默认选中</p>            </div><div class='checkbox yellow checked'><input type="checkbox" checked="checked"/>            <p>黄色 + 默认选中</p>            </div><div class='checkbox cyan checked'><input type="checkbox" checked="checked"/>            <p>青色 + 默认选中</p>            </div><div class='checkbox blue checked'><input type="checkbox" checked="checked"/>            <p>蓝色 + 默认选中</p>            </div><div class='checkbox plus green checked'><input type="checkbox" checked="checked"/>            <p>增加</p>            </div><div class='checkbox minus yellow checked'><input type="checkbox" checked="checked"/>            <p>减少</p>            </div><div class='checkbox times red checked'><input type="checkbox" checked="checked"/>            <p>叉</p>            </div><h2 id="单选列表-radio">单选列表 radio</h2><div class='checkbox'><input type="radio" />            <p>纯文本测试</p>            </div><div class='checkbox checked'><input type="radio" checked="checked"/>            <p>支持简单的 <a href="https://guides.github.com/features/mastering-markdown/">markdown</a> 语法</p>            </div><div class='checkbox red'><input type="radio" />            <p>支持自定义颜色</p>            </div><div class='checkbox green'><input type="radio" />            <p>绿色</p>            </div><div class='checkbox yellow'><input type="radio" />            <p>黄色</p>            </div><div class='checkbox cyan'><input type="radio" />            <p>青色</p>            </div><div class='checkbox blue'><input type="radio" />            <p>蓝色</p>            </div><h2 id="audio-video">audio / video</h2><div class="audio"><audio controls preload><source src='/music/parsley.mp3' type='audio/mp3'>Your browser does not support the audio tag.</audio></div><div class="videos" col='2'><div class="video"><video controls preload><source src='\video\club.mp4' type='video/mp4'>Your browser does not support the video tag.</video></div><div class="video"><video controls preload><source src='\video\club.mp4' type='video/mp4'>Your browser does not support the video tag.</video></div><div class="video"><video controls preload><source src='\video\club.mp4' type='video/mp4'>Your browser does not support the video tag.</video></div><div class="video"><video controls preload><source src='\video\club.mp4' type='video/mp4'>Your browser does not support the video tag.</video></div></div><h2 id="sites">sites</h2><div class="site-card-group"><a class="site-card" href="https://satorimarch.github.io"><div class="img"><img src="\img\koishi1.jpg"/></div><div class="info"><img src="\img\avatar1.jpg"/><span class="title">satori_march</span><span class="desc">这是说明1</span></div></a><a class="site-card" href="https://satorimarch.github.io"><div class="img"><img src="\img\koishi1.jpg"/></div><div class="info"><img src="\img\avatar1.jpg"/><span class="title">satori_march</span><span class="desc">这是说明2</span></div></a><a class="site-card" href="https://satorimarch.github.io"><div class="img"><img src="\img\koishi1.jpg"/></div><div class="info"><img src="\img\avatar1.jpg"/><span class="title">satori_march</span><span class="desc">这是说明3</span></div></a></div><h2 id="进度条-progress">进度条 progress</h2><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 90%" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100"><p>假期进度</p></div></div><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-red"  style="width: 10%" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100"><p>作业进度</p></div></div><hr>]]></content>
    
    
    <summary type="html">博客的测试页面</summary>
    
    
    
    <category term="博客" scheme="https://blog.satori-march.top/categories/blog/"/>
    
    
  </entry>
  
  <entry>
    <title>C#基础教程[1] 简介及基本语法</title>
    <link href="https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[1]%E7%AE%80%E4%BB%8B%E5%8F%8A%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95/"/>
    <id>https://blog.satori-march.top/posts/dotnet/c-sharp%E6%95%99%E7%A8%8B[1]%E7%AE%80%E4%BB%8B%E5%8F%8A%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95/</id>
    <published>2021-11-23T00:00:00.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>本系列教程是为了我在学校社团课使用而写的，我尽量在简单起见的情况下保证严谨一些，但可能仍有些随意或不严谨的地方，更严谨的说法请去看微软官方文档。因为学校高一的信息课会学习 python，因此会与 python 的语法作一些对比，不过不懂也没关系。</p><p>感谢 <a href="https://github.com/zbx1425">zbx1425</a> 大佬对于本系列教程的帮助</p><h3 id="可能有用的网址">可能有用的网址</h3><h4 id="教程-文档">教程/文档</h4><p><a href="https://www.runoob.com/csharp/csharp-tutorial.html">菜鸟教程</a></p><p><a href="https://docs.microsoft.com/zh-cn/learn/paths/csharp-first-steps/">微软官网教程</a></p><p><a href="https://docs.microsoft.com/zh-CN/dotnet/csharp/">微软官方文档</a>(如果有问题或者说的不清楚建议看英文原版)</p><h4 id="IDE">IDE</h4><p>IDE 即集成开发环境, 可以不严谨的理解为编写并运行代码所用的软件</p><p><a href="https://visualstudio.microsoft.com/zh-hans/downloads/">Visual Studio</a>：简称 VS, 如果可以的话对于写 C# 必然是首选，不过体积较大，可能要占好几个GB</p><p><a href="https://sourceforge.net/projects/sharpdevelop/">Sharp Develop</a>：VS 中很多功能对于初学者没有必要，所以也可以用 Sharp Devlop，安装包仅十几MB，但已停止维护</p><p>如果临时使用手机可以考虑在线工具例如<a href="http://www.dooccn.com/csharp/">这个</a></p><h2 id="简介">简介</h2><div class="note flat"><p>以下内容来自<a href="https://zh.wikipedia.org/wiki/C%E2%99%AF">维基百科</a></p></div><blockquote><p>C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C#是一种由C和C++派生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性，使其成为C语言家族中的一种高效强大的编程语言。C#以.NET框架类库作为基础，拥有类似Visual Basic的快速开发能力。C#由安德斯·海尔斯伯格主持开发，微软在2000年发布了这种语言，希望借助这种语言来取代Java。</p></blockquote><hr><h2 id="hello-world">hello, world</h2><p>各位同学可能在课内学习过一点 python。以输出 <code>&quot;hello world&quot;</code> 作为初学者的第一个程序是计算机界的传统，这是一个能打印出 <code>&quot;hello world&quot;</code> 的 python 程序：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(<span class="string">&quot;hello world&quot;</span>)</span><br></pre></td></tr></table></figure><p>在真正上手写 C# 之前，我们先来看一个能实现同样功能的 C# 程序，来大致了解一下 C# 语言是怎样的：</p><div class="note info flat"><p><code>//</code> 代表开始单行注释, <code>//</code> 后面的内容都是解释代码意思的文字, 与程序的运行无关</p></div><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">ConsoleApp</span>  <span class="comment">// ConsoleApp命名空间(namespace)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">class</span> <span class="title">Program</span>  <span class="comment">// Program类(class)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)  <span class="comment">// Main函数</span></span></span><br><span class="line">        &#123;</span><br><span class="line">            Console.WriteLine(<span class="string">&quot;Hello World!&quot;</span>);  <span class="comment">// 输出语句</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="程序结构">程序结构</h3><p>先不要被这么多代码吓到, 我们来分析一下:</p><ul><li>比起功能相同的 python 程序，内容多多了</li><li>不过真正进行&quot;打印文字&quot;这一操作的代码也只有一行(含有 <code>WriteLine</code> 的那行)</li><li>代码似乎被大括号分成了很多块</li></ul><p>大括号的包含关系是 C# 的一个特点。上面的代码有一个命名空间(<code>namespace</code>)，里面包含着一个类（<code>class</code>），类里面又包含着一个&quot;主函数&quot;（<code>Main</code>），主函数里装着真正的用来打印文字的代码（严格来讲，C#中的函数应该被称为方法，但为了便于理解，请允许我在详细讲解方法之前称为函数）。作为初学者，各位暂时不需要理解什么是函数、类、命名空间，先把它当作模板照着写就好了，下面简单介绍一下他们的关系。</p><p>举个例子来说，就像这样：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">学校 南开中学</span><br><span class="line">&#123;</span><br><span class="line">    学生 小明</span><br><span class="line">    &#123;</span><br><span class="line">        参加考试(考试地点) &#123;</span><br><span class="line">            考试过程</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>你可能只想描述小明考试的过程，但是 C# 里就得一笔带过地稍微描述下小明这人和它的学校。之所以这么麻烦，是因为 C# 规定，执行的内容必须得被包含在函数里，函数必须得被包含在类里，类又必须得被包含在命名空间里…所以咱的代码就给包成了个三明治，不像 python 直接开始写就行。大家可能会觉得，这样比功能相同的 python 代码要繁琐很多，这样的设计看似没有必要，但实际上在大点的项目里便能展现出它的优势</p><p>不过还是那句话，外面的包装是我们初学者不需太关心的，大家目前只需要注意一下 <code>Main</code> 函数里的内容。我们的程序总会从 <code>Main</code> 函数开始执行。所以我们来集中精力看这一行实际干活的代码。</p><p>在语句 <code>Console.WriteLine(&quot;Hello World!&quot;);</code> 中，<code>Console</code> 其实也是一个类，而 <code>WriteLine()</code> 则为 <code>Console</code> 类中的一个函数，中间的 <code>.</code> 表示访问 <code>Console</code> 类中的成员（“其学名为成员访问运算符”），此处访问的即为该类中的 <code>WriteLine()</code> 函数。</p><p><code>Console</code>是控制台的意思，也就是运行程序时看到的那个黑窗口；而 <code>Console</code> <code>.</code> <code>WriteLine</code> 就是调用 <code>控制台</code> <code>里面的</code> 叫做 <code>写一行字</code> 的函数。大家目前只需要对类的事情稍微留一些印象即可，不用过多关注。</p><div class="note warning flat"><p>函数的后面必须有括号，即使它没有参数。例如调用 <code>Console.WriteLine();</code> 会输出空行</p></div><p>因为我们目前只看主函数部分，所以后面会省略主函数之外的内容, 将上面那段代码写成如下的形式[^1]：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Console.WriteLine(<span class="string">&quot;Hello World!&quot;</span>);  <span class="comment">// 输出语句</span></span><br></pre></td></tr></table></figure><p>如果你把上面的 <code>Console</code> 改为 <code>console</code>, 你会在“输出”区域看到一条错误消息：</p><div class="note danger flat"><p>error CS0103: The name ‘console’ does not exist in the current context</p></div><p>翻译一下就是 <code>console</code> 在当前上下文中不存在, 也就是说, 编译器不认识 <code>console</code>, 只认识 <code>Console</code></p><div class="note warning flat"><p>不要把单词拼错（英语不好的同学可能有些困难，但是请尽量），拼错单词英语考试里会没分，C# 里会编译失败</p><p>C# 是区分大小写的！请注意各个单词的大小写，大小写搞错也会导致编译错误。一般来说<code>namespace</code>, <code>class</code>等“关键字”是全小写，函数是各单词首字母大写。</p></div><ul><li>一些 IDE 会替你查找潜在错误, 然后在出错的地方加上红色波浪线, 你可以将鼠标光标移上去来查看详细信息(有时候出现的红色波浪线只是因为你代码没打完)</li><li>没有红色波浪线的时候, 将光标移到函数或类上可以查看它的定义和注释来快速理解它的用法(函数和类的定义以后会讲)<s>可惜SharpDevelop只有定义没有注释</s></li></ul><h2 id="基本语法">基本语法</h2><h3 id="数据类型">数据类型</h3><p>在学习初期我们会见到的值类型如下:</p><table><thead><tr><th>类型</th><th>描述</th><th>范围</th><th>默认值</th></tr></thead><tbody><tr><td>bool</td><td>布尔值</td><td><code>True</code> 或 <code>False</code></td><td><code>False</code></td></tr><tr><td>double</td><td>浮点型</td><td>非常大</td><td>0.0D</td></tr><tr><td>int</td><td>整型</td><td>约±20亿</td><td>0</td></tr><tr><td>string</td><td>字符串 (文本)</td><td>-</td><td>空(null)</td></tr></tbody></table><ul><li><code>bool</code> 即布尔值, 参与逻辑运算, 值只能是 <code>True</code> 或 <code>False</code> 的其中一个</li><li><code>int</code> 即整数, 一般表示整数用 <code>int</code> 即可</li><li><code>double</code> 类型可以不严谨的认为是小数</li><li>字符串(<code>string</code> 类型)其实我们已经用过了, 用双引号括起来的便是字符串, 例如 <code>&quot;Hello World!&quot;</code> (注意不能是单引号)</li></ul><p>请大家注意 <code>string</code> 类型的 <code>&quot;25&quot;</code> 和 <code>int</code> 类型的 <code>25</code> 的区别: 前者是一个字符串, 与 <code>&quot;abc&quot;</code> 本质上没有区别, 因此 <code>&quot;25&quot;</code> 无法参与实数运算, 也就是不能写 <code>&quot;25&quot; * 10</code>, 请先转换成 <code>int</code> 类型再计算</p><p>将其他三种类型转换为<code>double</code>的代码: <code>Convert.ToDouble(x)</code>, 其返回值的类型为 <code>Double</code>, 其中的 <code>x</code> 为调用 <code>ToDouble</code> 函数的参数; 而返回值顾名思义, 就是调用的函数运行后返回的结果, <code>WriteLine</code> 没有返回值. 与 <code>ToDouble()</code> 同理:</p><ul><li>转换为 <code>string</code> 的代码为: <code>Convert.ToString(x)</code></li><li>转换为 <code>int</code> 的代码为: <code>Convert.ToInt32(x)</code> (只有这个需要写为 <code>Int32</code> 比较特殊, 不过并不需要特殊记忆, 因为 IDE 的代码补全会有提示)</li></ul><p>类型转换的用法例如: (代码中的 <code>string a</code> <code>int b</code> 等的用法会在下面介绍)</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> a = <span class="string">&quot;55&quot;</span>;</span><br><span class="line"><span class="built_in">int</span> b = Convert.ToInt32(a);</span><br><span class="line">Console.WriteLine(b * <span class="number">10</span>);</span><br></pre></td></tr></table></figure><p>输出结果为:</p><div class="note default flat"><p>550</p></div><div class="note info flat"><p>在初学阶段, 即使你已经看明白了代码的意思, 也建议不看文章手动输入一遍本文中的例子. 一是为了加深记忆, 二是有时看懂了可能只是有些问题没有发现</p></div><p>大家可能会疑惑 <code>a = &quot;55&quot;</code> 等地方为什么要加空格. 只是为了规范, 这些空格并不会影响程序的运行, 只是为了读起来方便. 实际上所有那种不影响语义的空格和换行都可以去掉, 把上面的代码写成这样:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> a=<span class="string">&quot;55&quot;</span>;<span class="built_in">int</span> b=Convert.ToInt32(a);Console.WriteLine(b*<span class="number">10</span>);</span><br></pre></td></tr></table></figure><p>但这样看起来就很难懂了, 建议别这么写. 注意 <code>int</code> 和 <code>b</code> 之间的空格不能省略成<code>intb</code>(显然把两个词连成一个词会影响语义)</p><p>对于多数IDE(快捷键可能有些许不同), 当你在输入内容的时候, 你很可能会看到代码补全的候选列表:</p><ul><li>在显示候选列表时：按Tab可以采纳选中的建议，按↑↓可以浏览不同的建议，如果不想要这些建议可以按Esc退出候选列表</li><li>在没有显示候选列表时：按 <code>Tab</code> 可以插入四个空格，按 <code>Shift+Tab</code> 可以去掉四个空格</li></ul><h3 id="变量的声明和定义">变量的声明和定义</h3><p>如果需要处理代码里没有的数据，就需要声明一个变量。刚刚其实已经用过变量了。一个&quot;变量&quot;是在其生存期内可以更改其值的数据项。可以使用变量来临时存储稍后要在代码中使用的值。</p><p>在 python 中, 声明变量前不需说明类型, 例如:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">a = <span class="number">5</span></span><br><span class="line">abc = <span class="string">&quot;abc&quot;</span></span><br></pre></td></tr></table></figure><p>但在 C# 中需要显示指明类型应写为这样:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>;</span><br><span class="line"><span class="built_in">string</span> abc = <span class="string">&quot;apple&quot;</span>;</span><br></pre></td></tr></table></figure><p>你可以用逗号来声明多个相同类型的变量:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>, b = <span class="number">10</span>, c = <span class="number">20</span>;</span><br></pre></td></tr></table></figure><p>C# 中一个变量的类型在声明时已经固定, 不能赋其他类型的值, 在 python 中, 这样的代码是合法的:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">a = <span class="number">5</span></span><br><span class="line">a = <span class="string">&quot;abc&quot;</span>  // 注意是给同一个变量 a 赋值</span><br></pre></td></tr></table></figure><p>但在 C# 中会报错:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>;</span><br><span class="line">a = <span class="string">&quot;55&quot;</span>;</span><br></pre></td></tr></table></figure><div class="note danger flat"><p>错误 CS0029 无法将类型“string”隐式转换为“int”</p></div><p>&quot;隐式类型转换&quot;指的是你没有显式说明, 而是自动进行的类型转换. 一般来说, 只有转换之后 <emp>肯定不会</emp> 造成数据损失或者错误的类型之间才能进行隐式类型转换(注意, 是所有这类型的数据都不会出现问题才能隐式转换, 举特例是不行的). 例如:</p><ul><li><code>string</code> <emp>不能</emp> 隐式转换为 <code>int</code>, 因为有像 <code>&quot;abc&quot;</code> 这类字符串</li><li><code>int</code> 可以隐式转换为 <code>string</code></li><li><code>double</code> <emp>不能</emp> 隐式转换为 <code>int</code>, 因为会丢失小数部分</li><li><code>int</code> 可以隐式转换为 <code>double</code></li></ul><p>为了将上面的 <code>string</code> 类型的 <code>&quot;55&quot;</code> 转换为 <code>int</code> 类型的 <code>55</code>, 可以考虑使用上面提过的 <code>Convert.ToInt32()</code> 函数, 例如:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = Convert.ToInt32(<span class="string">&quot;55&quot;</span>);</span><br><span class="line">Console.WriteLine(a);</span><br></pre></td></tr></table></figure><p>关于类型转换的更多内容可以参考我的另一篇文章<a href="https://satorimarch.github.io/posts/19004/">c#中的数据类型转换</a></p><h3 id="标准输入输出">标准输入输出</h3><p>C# 中的函数名一般比较直观易懂，<s>不像某语言中乍一看不知所云的 <code>atoi</code></s>。例如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Console.Write(<span class="string">&quot;hello &quot;</span>);  <span class="comment">// 输出到控制台(无换行)</span></span><br><span class="line">Console.WriteLine(<span class="string">&quot;world&quot;</span>);  <span class="comment">// 输出到控制台(有换行)</span></span><br></pre></td></tr></table></figure><p>上面的代码输出如下:</p><div class="note default flat"><p>hello world</p></div><p>与 <code>WriteLine()</code> 相对应, 从标准输入流读入下一行字符并存储为字符串的函数叫 <code>ReadLine()</code></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> a;</span><br><span class="line">a = Console.ReadLine();</span><br><span class="line">Console.WriteLine(a);</span><br></pre></td></tr></table></figure><p>函数的嵌套：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = Convert.ToInt32(Console.ReadLine());</span><br></pre></td></tr></table></figure><p>类比数学中的复合函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(g(x))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">))</span></span></span></span>, 嵌套函数的应从内往外开始运行, 也就是先执行 <code>Console.ReadLine()</code>, 再把该函数的返回值代入到 <code>Convert.ToInt32()</code> 中</p><h4 id="WriteLine-的格式化-format">WriteLine()的格式化 (format)</h4><p>如果想要依次输出 abc 的值, 并在前面输出变量名和等号, 例如 <code>a=1</code>, 以我们之前学的内容应该这么写:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>, b = <span class="number">15</span>, c = <span class="number">10</span>;</span><br><span class="line">Console.WriteLine(<span class="string">&quot;a=&quot;</span> + a + <span class="string">&quot; b=&quot;</span> + b + <span class="string">&quot; c=&quot;</span> + c); </span><br></pre></td></tr></table></figure><p>上面的代码中 abc 分别被隐式转换成字符串然后进行字符串串联. 这样很是麻烦还不方便阅读, 有没有更简单的方法呢?<s>既然我这么说了</s>, 当然是有的:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">1</span>, b = <span class="number">2</span>, c = <span class="number">3</span>;</span><br><span class="line">Console.WriteLine(<span class="string">&quot;a=&#123;0&#125; b=&#123;1&#125; c=&#123;2&#125;&quot;</span>, a, b, c);</span><br></pre></td></tr></table></figure><p>其中 <code>&#123;n&#125;</code> 表示字符串后面的第 <code>n</code> 个对象(从 <code>0</code> 开始计数)<br>我们管 <code>&#123;n&#125;</code> 叫做占位符, 你可以理解为它把对应的值的位置给占了, 而在运行的时候会把后面的值放到占位符的位置上</p><p>从 <code>C#6.0</code> 开始还有一种更方便阅读的语法, 在字符串前面加上 <code>$</code> 就可以直接在大括号里写变量名:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Console.WriteLine(<span class="string">$&quot;a=<span class="subst">&#123;a&#125;</span> b=<span class="subst">&#123;b&#125;</span> c=<span class="subst">&#123;c&#125;</span>&quot;</span>);</span><br></pre></td></tr></table></figure><p>不过 SharpDevelop 只支持到 <code>C#5.0</code>(</p><h3 id="运算符">运算符</h3><p>C# 中的赋值/算术/比较运算符与 python 基本相同, 但也仍有很多差别。</p><h4 id="赋值运算符">赋值运算符</h4><p>大家看到 <code>a = 5</code> 的时候可能并不会想太多, <code>a</code> 等于 <code>5</code> 感觉很合理. 但实际上, <code>=</code> 并不是等于的意思, 例如 <code>a = a + 1</code> 语句看起来在数学上恒不成立, 但在代码中是合法的. 这是因为 <code>=</code> 的学名叫做赋值运算符, 他表达的意思实际上是&quot;计算出右侧的值, 然后把右侧的值赋给左边的变量&quot;. 假如 <code>int</code> 变量 <code>a</code> 原本为 <code>5</code>, 在 <code>a = a + 1</code> 中, 会先计算出右边的数值 <code>a + 1</code> 即为 <code>6</code>, 然后将 <code>6</code> 赋给左边的变量 <code>a</code>, 故该语句运行之后 <code>a</code> 的值为 <code>6</code></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>;</span><br><span class="line">a = a + <span class="number">10</span>;</span><br><span class="line">Console.WriteLine(a);  <span class="comment">// 输出15</span></span><br></pre></td></tr></table></figure><p>由于 <code>a = a + ?</code> 的使用率很高, 所以又有了一种运算符为 <code>+=</code>, <code>a += 5</code> 相当于 <code>a = a + 5</code>, 同理还有 <code>-=</code> 等运算符</p><p>另外, C# 中还有 <code>++</code> 运算符, <code>a++</code> 基本相当于 <code>a += 1</code> 也就是 <code>a = a + 1</code>, <code>--</code>运算符同理. 你也可以把 <code>++</code> 写到前面如 <code>++a</code>. 但是<code>a++</code> 与 <code>++a</code> 作为复合表达式的时候有些区别, 因此在没弄清楚前不要写诸如 <code>b = a++;</code> 这种式子</p><h4 id="算术运算符">算术运算符</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>, b = <span class="number">10</span>;</span><br><span class="line">Console.WriteLine(a + b);  <span class="comment">// 输出 15</span></span><br><span class="line">Console.WriteLine(a - b);  <span class="comment">// 输出 -5</span></span><br><span class="line">Console.WriteLine(a * b);  <span class="comment">// 输出 50</span></span><br><span class="line">Console.WriteLine(a / b);  <span class="comment">// 输出 0</span></span><br></pre></td></tr></table></figure><p>大家请注意最后 <code>a/b</code> 的结果: <code>5/10</code> 返回的结果竟然是 <code>0</code></p><p>那让我们再试一下这段代码：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>;</span><br><span class="line"><span class="built_in">double</span> b = <span class="number">10.0</span>;  <span class="comment">// 注意这里 b 的类型</span></span><br><span class="line"></span><br><span class="line">Console.WriteLine(a / b);  <span class="comment">// 输出 0.5</span></span><br></pre></td></tr></table></figure><p>这样写输出的结果就变成了 <code>0.5</code></p><div class="note danger flat"><p>C# 中的 <code>/</code> 在两个操作数中至少有一个是浮点数时才会为实数除法, 否则会向 <code>0</code> 取整, 例如: <code>-5/2</code> 的结果是 <code>-2</code>, <code>-5/2.0</code> 的结果是 <code>-2.5</code></p></div><h4 id="例-1-1-a-b-×c-洛谷B2008">例 1-1 (a+b)×c (洛谷B2008)</h4><p>读入 3 个整数 a,b,c, 输出表达式 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><mo>×</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">(a+b) \times c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>  的值。</p><p>示例代码:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"><span class="built_in">int</span> b = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"><span class="built_in">int</span> c = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"><span class="built_in">int</span> answer = (a + b) * c;</span><br><span class="line">Console.WriteLine(answer);</span><br></pre></td></tr></table></figure><p>前三行的读入看起来有些繁琐, 第四节会学到简单点的写法. 另外, 多数 IDE 会有复制当前行的快捷键, 可以去设置里找一下. 你也可以省略中间变量 <code>answer</code>, 将最后两行合并写成:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Console.WriteLine((a + b) * c);</span><br></pre></td></tr></table></figure><p><code>string</code> 类型也可以进行 <code>+</code> 操作, 例如 <code>&quot;abc&quot; + &quot;def&quot;</code> 会得到 <code>&quot;abcdef&quot;</code></p><h4 id="比较运算符">比较运算符</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>, b = <span class="number">10</span>;</span><br><span class="line">Console.WriteLine(a == b);  <span class="comment">//输出 False</span></span><br><span class="line">Console.WriteLine(a != b);  <span class="comment">//输出 True</span></span><br><span class="line">Console.WriteLine(a &gt;= b);  <span class="comment">//输出 False</span></span><br><span class="line">Console.WriteLine(a &lt;= b);  <span class="comment">//输出 True</span></span><br><span class="line">Console.WriteLine(a &gt; b);   <span class="comment">//输出 False</span></span><br><span class="line">Console.WriteLine(a &lt; b);   <span class="comment">//输出 True</span></span><br></pre></td></tr></table></figure><p>那让我们试试下面的代码:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Console.WriteLine(<span class="number">7</span> &lt; <span class="number">5</span> &lt; <span class="number">10</span>);</span><br></pre></td></tr></table></figure><p>与我们的预期不同, 这段代码报错了:</p><div class="note danger flat"><p>CS0019 运算符“&lt;”无法应用于“bool”和“int”类型的操作数</p></div><p>这是因为编译器会把表达式 <code>7 &lt; 5 &lt; 10</code> 理解为 <code>(7 &lt; 5) &lt; 5</code>, 而<code>7 &lt; 5</code> 会返回 <code>bool</code> 类型的 <code>False</code>, 而在 C# 中 <code>bool</code> 类型不能直接与 <code>int</code> 类型进行比较, 也不能隐式转换成 <code>int</code> 类型, 因此这个表达式会报错</p><div class="note danger flat"><p>不能把表达式写成形如 <code>a &lt;= x &lt;= b</code> 的形式, 应该写为 <code>a &lt;= x &amp;&amp; x &lt;= b</code> （ <code>&amp;&amp;</code> 表示 “并且”, 将在后面的逻辑运算符进行讲解）</p></div><p>另外, C# 中没有 python 中的 <code>**</code> 等运算符, 如果想求出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>a</mi><mi>b</mi></msup></mrow><annotation encoding="application/x-tex">a^b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">b</span></span></span></span></span></span></span></span></span></span></span>, 请使用 <code>Math.Pow(a, b);</code> 函数</p><h4 id="逻辑运算符">逻辑运算符</h4><p>C# 中的逻辑运算符如下(已知 <code>A = true, B = false</code>):</p><table><thead><tr><th style="text-align:left">运算符</th><th style="text-align:left">描述</th><th style="text-align:left">实例</th><th>python</th></tr></thead><tbody><tr><td style="text-align:left">&amp;&amp;</td><td style="text-align:left">称为逻辑与运算符。如果两个操作数都非零，则条件为真。</td><td style="text-align:left">(A &amp;&amp; B) 为假。</td><td>and</td></tr><tr><td style="text-align:left">||</td><td style="text-align:left">称为逻辑或运算符。如果两个操作数中有任意一个非零，则条件为真。</td><td style="text-align:left">(A || B) 为真。</td><td>or</td></tr><tr><td style="text-align:left">!</td><td style="text-align:left">称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则变为假。</td><td style="text-align:left">!(A &amp;&amp; B) 为真。</td><td>not</td></tr></tbody></table><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">bool</span> a = <span class="literal">true</span>, b = <span class="literal">true</span>, c = <span class="literal">false</span>;</span><br><span class="line">Console.WriteLine(a &amp;&amp; b);  <span class="comment">//输出 True</span></span><br><span class="line">Console.WriteLine(a &amp;&amp; c);  <span class="comment">//输出 False</span></span><br><span class="line">Console.WriteLine(a || b);  <span class="comment">//输出 True</span></span><br><span class="line">Console.WriteLine(a || c);  <span class="comment">//输出 True</span></span><br><span class="line">Console.WriteLine(!a);     <span class="comment">//输出 False</span></span><br><span class="line">Console.WriteLine(!c);     <span class="comment">//输出 True</span></span><br></pre></td></tr></table></figure><h3 id="if-语句"><code>if ()</code>语句</h3><p><code>if ()</code> 语句的条件要在小括号里, 如果条件表达式为 <code>true</code> 的时候执行的语句在大括号里(或者说大括号包裹的部分为一个代码块, 执行整个代码块), 例如:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> score = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (score == <span class="number">0</span>) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;我爆零了&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>else</code> 中的语句只有在对应的 <code>if</code> 的条件不满足的时候才会执行, 例如:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> score = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (score == <span class="number">0</span>) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;我爆零了&quot;</span>);</span><br><span class="line">&#125; </span><br><span class="line"><span class="keyword">else</span> &#123;  <span class="comment">// 有些人会习惯把 else 和上一行的 &#125; 写到一行</span></span><br><span class="line">    Console.WriteLine(<span class="string">&quot;我没爆零&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意体会下面两段代码的区别:</p><ol><li>代码1, 这段代码相当于三选一:</li></ol><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (a) &#123;</span><br><span class="line">    <span class="comment">// a 为 true 时运行</span></span><br><span class="line">&#125; </span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (b) &#123;  <span class="comment">// 注意这行多一个else</span></span><br><span class="line">    <span class="comment">// a 为 false 且 b 为 true 时运行</span></span><br><span class="line">&#125; </span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="comment">// a,b 都为 false 时运行</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li>代码2, 注意这时后两个分支与 <code>a</code> 无关</li></ol><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (a) &#123;</span><br><span class="line">    <span class="comment">// a 为 true 时运行</span></span><br><span class="line">&#125;  </span><br><span class="line"><span class="comment">// 实际运用时这行可以加个空行防止误解</span></span><br><span class="line"><span class="keyword">if</span> (b) &#123;</span><br><span class="line">    <span class="comment">// b 为 true 时运行, 与 a 无关</span></span><br><span class="line">&#125; </span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="comment">// b 为 false 时运行, 与 a 无关</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="例题-1-2-判断数正负-洛谷B2035">例题 1-2 判断数正负(洛谷B2035)</h4><p>给定一个整数 <code>N</code>，判断其正负。如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>&gt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">N&gt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>, 输出 <code>positive</code> ; 如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">N=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>, 输出 <code>zero</code> ; 如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>&lt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">N&lt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>, 输出 <code>negative</code>。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> n = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"><span class="keyword">if</span> (n &gt; <span class="number">0</span>) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;positive&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (n == <span class="number">0</span>) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;zero&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (n &lt; <span class="number">0</span>) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;negative&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>因为 <code>n</code> 的三种取值是互斥的所以这里也可以这么写(不推荐):</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> n = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"><span class="keyword">if</span> (n &gt; <span class="number">0</span>) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;positive&quot;</span>);</span><br><span class="line">&#125; </span><br><span class="line"><span class="keyword">if</span> (n == <span class="number">0</span>) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;zero&quot;</span>);</span><br><span class="line">&#125; </span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;negative&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="练习">练习</h2><p>如果你觉得读入麻烦那么改成声明变量时初始化(如<code>int a = 5;</code>)也可以, 但请确保你会读入一行字符串并转换为整数</p><h3 id="1-1-圆柱体的表面积">1-1 圆柱体的表面积</h3><p>给出圆柱体的底面半径 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span></span> 和 高 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi></mrow><annotation encoding="application/x-tex">h</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">h</span></span></span></span>, 分两行依次输出该圆柱体的侧面积和底面面积</p><h3 id="1-2-直角三角形">1-2 直角三角形</h3><p>已知三条边的长度(分三行给出), 判断是否能围成直角三角形, 若是则输出 <code>yes</code>, 否则输出 <code>no</code></p><h4 id="1-2-2">1-2-2</h4><p>判断条件改为: 若为直角三角形输出 <code>yes</code>, 否则若能够构成三角形输出 <code>no</code>, 不能构成三角形输出 <code>not a triangle</code></p><h3 id="1-3-三排序">1-3 三排序</h3><p>输入三个整数, 按从小到大排序后输出</p><h4 id="挑战">挑战</h4><p>本题只使用3个 <code>if</code> 语句便可完成任务</p><h3 id="1-4-一元二次方程">1-4 一元二次方程</h3><p>依次给出一元二次方程的a,b,c(均为整数, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo mathvariant="normal">≠</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">a\neq 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>), 利用求根公式求一元二次方程实数根, 保留两位小数。有两实根时先输出更小的，一实根时输出那一个根，无实根时输出 <code>&quot;No Answer&quot;</code></p><p>提示:</p><ul><li>使用 <code>Console.WriteLine(&quot;&#123;0:F2&#125;&quot;, 0.125);</code> 来对 <code>0.125</code> 保留 <code>2</code> 位小数, 其中 <code>F2</code> 的 <code>2</code> 表示两位</li><li>使用 <code>Math.Sqrt(a)</code> 来 求出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msqrt><mi>a</mi></msqrt></mrow><annotation encoding="application/x-tex">\sqrt a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.2397em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8003em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal" style="padding-left:0.833em;">a</span></span><span style="top:-2.7603em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2397em;"><span></span></span></span></span></span></span></span></span></li></ul><hr><h2 id="练习参考代码">练习参考代码</h2><h3 id="1-1-圆柱体的表面积-2">1-1 圆柱体的表面积</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> r = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"><span class="built_in">int</span> h = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"></span><br><span class="line">Console.WriteLine(Math.PI * r * r);</span><br><span class="line">Console.WriteLine(<span class="number">2</span> * Math.PI * r * h);</span><br></pre></td></tr></table></figure><h3 id="1-2-直角三角形-2">1-2 直角三角形</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"><span class="built_in">int</span> b = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"><span class="built_in">int</span> c = Convert.ToInt32(Console.ReadLine());</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (a*a == b*b + c*c || b*b == a*a + c*c || c*c == a*a + b*b) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;yes&quot;</span>);</span><br><span class="line">&#125; </span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;no&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><div class="note info flat"><p>如果你不知道哪个运算符的优先级比较高(或者说先计算哪个), 那就多加括号</p></div><h4 id="1-2-2-2">1-2-2</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 省略输入</span></span><br><span class="line"><span class="keyword">if</span> (a + b &lt;= c || a + c &lt;= b || b + c &lt;= a) &#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;not a triangle&quot;</span>);</span><br><span class="line">&#125; </span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">if</span> (a*a == b*b + c*c || b*b == a*a + c*c || c*c == a*a + b*b) &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;yes&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> &#123;</span><br><span class="line">        Console.WriteLine(<span class="string">&quot;no&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure><h3 id="1-3-三排序-2">1-3 三排序</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 省略输入</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (a &gt; b) &#123;</span><br><span class="line">    <span class="built_in">int</span> temp = a;</span><br><span class="line">    a = b;</span><br><span class="line">    b = temp;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (a &gt; c) &#123;</span><br><span class="line">    <span class="built_in">int</span> temp = a;</span><br><span class="line">    a = c;</span><br><span class="line">    c = temp;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (b &gt; c) &#123;</span><br><span class="line">    <span class="built_in">int</span> temp = b;</span><br><span class="line">    b = c;</span><br><span class="line">    c = temp;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Console.WriteLine(<span class="string">&quot;&#123;0&#125;\n&#123;1&#125;\n&#123;2&#125;&quot;</span>, a, b, c);</span><br></pre></td></tr></table></figure><h3 id="1-4-一元二次方程-2">1-4 一元二次方程</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 省略输入</span></span><br><span class="line"><span class="built_in">double</span> delta = b * b - <span class="number">4</span> * a * c;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (delta &lt; <span class="number">0</span>) &#123;</span><br><span class="line">Console.WriteLine(<span class="string">&quot;No Answer&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> &#123;</span><br><span class="line">Console.WriteLine(<span class="string">&quot;&#123;0:F2&#125;&quot;</span>, (- b - Math.Sqrt(delta))/<span class="number">2</span>/a);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (delta &gt; <span class="number">0</span>) &#123;</span><br><span class="line">Console.WriteLine(<span class="string">&quot;&#123;0:F2&#125;&quot;</span>, (- b + Math.Sqrt(delta))/<span class="number">2</span>/a);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><p>[^1]: 实际上这么写在开了隐式 using 的 C#10 或者前面加上 <code>using System;</code> 后在 C#9.0 中是合法的, 但不推荐初学者这么做</p>]]></content>
    
    
    <summary type="html">为了学校社团课而写的c#基础教程第一章, 从hello world开始的C#之旅</summary>
    
    
    
    <category term="c#" scheme="https://blog.satori-march.top/categories/csharp/"/>
    
    <category term="电子电路社" scheme="https://blog.satori-march.top/categories/%E7%94%B5%E5%AD%90%E7%94%B5%E8%B7%AF%E7%A4%BE/"/>
    
    <category term="c#教程" scheme="https://blog.satori-march.top/categories/csharp/charp-tutorial/"/>
    
    
    <category term="c#" scheme="https://blog.satori-march.top/tags/csharp/"/>
    
  </entry>
  
  <entry>
    <title>电子电路社纳新</title>
    <link href="https://blog.satori-march.top/posts/misc/%E7%94%B5%E5%AD%90%E7%94%B5%E8%B7%AF%E7%A4%BE%E7%BA%B3%E6%96%B0/"/>
    <id>https://blog.satori-march.top/posts/misc/%E7%94%B5%E5%AD%90%E7%94%B5%E8%B7%AF%E7%A4%BE%E7%BA%B3%E6%96%B0/</id>
    <published>2021-11-20T00:00:00.000Z</published>
    <updated>2023-12-19T17:21:25.000Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="481fbd61c47d35f1e4cb60953ec658d394b8628cf21b33462f1de74c2bfabc59">1e841e7579db121a9c9d872c6d9be32296ba5a74af25cc32d57cda74b0acac1b6aa14c15ea134c2af48e4f21150ffac6fb41faa6533e6586386251ac4e065085b3fb10dbc5a3945f9e2394b37aa9c823202d37151082df73660ddff2b609ade55fc3308b3747b1a70cd04372e92f314be31e94932c4e7138c9b13fa77838400c27819488c64248fab729af7bc6fe255ba3a1fe5713ad653a5f8b91f4330f395b8203438c2caec6514386f9b02506b3fc493cd1484325b672ac104d3991e7ef5e0b9441c7b65a61b04b23dfc580e10018f6f91ff3885eb3f238272c7a049781065fb1d0c3c1e369abbdcac110993212ebba36385dca63ac96932de2586cf7c8e46882cb42eb58d74ce8e48b45ba24b7969fcfd6aaa4809bfa11cad35e1aa196e477d9c34c6bf5ac92e021ebb21979fde56288044816171524522aff59fbe1b88fba4ff624df8676fa94e6cb995c4f3c7c8899c0800b2b8f36f71fbeb9641e2d868661d08e8d39b2d209917b4f3699a490c86db4398fd78e78df83ebab8795de0f6511ffd99e49b4e6086badc13329de31a5b43b20238535e48814f2ceec3e470095af77556f0f74d3b5f6f97c1cce40a60240d911d2b0ca8e93aeec01084c1c2131c724837a3fb4ea589cbca17c614a09c3818ae1a7ffcc7c4b224f06f963fef04d9176348d7936ee7b62fe4b4b5b81b80df58569b75488aca9a43b755db953ce750765fcdd8d5d96818286328aa73fe04ac6e8a15d8ee7680710e1422b882c9b328a4f23b7bfd934c58236044ef8c33409248ebd8332540cc8ae5a2ad0e16d4fc6e01086d34bfa1032ab4745daef9cd8b509be2b26eb2a4d4d76ff317f642425788563a658a82c69c54c5925b0588c81b0b4d146966820929aa49074c179526753fc5367f2e3ce12fad17964b7c02ca98c3c71b9fedfe338e0fade95096cdaff1c60870471723eb255d892336a239e5faa27f6960b85815a684b3a6910c7d6ed19ba37adc37711312298148e11b8fbb62cfd81e33ec1cb0fdc73c9b2b4988c611f62cb264ed52cae6d5e57218deb895a13d218e8575af3ea3c4329606c8ca2b95d9d0d68e6d391fa19ba387f6a02d9c241316263360b4ff01d01dfb238d6a4c62cac57a576c5e89dc285e61ccff1b50fe28d10e8bd0d88629b321341086d6c89347b4b0b69b7f1c068b4e7f3aaedb284cc576ac9c9f5c871e01995c87dd3927efb45853b7ea6113142d9eef7cc7c8c0a126b890d646a3eb7ed9a513731be5435ae375ae6f266cb6543d85be6ff88a25668fba484eda50ea6e92311a0ac712e2d08d96e0860675101e1d1cff2853719b72ec7226165e068e81e2b390914175015d74eb9c87a410f812127116cba658192f8daeebc16eda314b6dcf2cabe399d593e399a7caa47e6f516ece6f065287747077f98370723bcd5ee2aa175bdc859d0e79f73e651fc2e77fd3a0133daaa52315499d3963db372fab28af803babc0eb330370ed6a5ee8073d396b302f66081c595d43ade9b33772d9ff99dd3b236ecf056fa66c9df104605164695bb0d0f95727c581ea3fac42b09c779a4fa7ea1bc81056611da58e73d55c1cf068602960affa3cdb7da72d73d254bed1b39203c73a914bdb69814a32044daf6c4aef642f245a23e020b58c7cca3ad75a991739078642c54983b683658ee2d6fccd7b1cbc3c38099b9323e023421fa1a6e8eb7911a9e05fcbbafc94c92ccc05b6c91dc5f3750fda71927bef87a1a69cbed892defbec290783644450b567484bf30e4f8da491bf4a8329826176a6b84b05756f83325625c9a4e4af49f1fd608a9e9e63220b15b0d9e1f5ebb5071657fb702c873b9bd35d9f533b5d1b4147642ac6e119771a1f1c6276af8bcb2141d3e0c4ce11dfa847243908dd13c5bdba8eeb3618b5b944f3d06d4de1fd6c123dbed9ca0646c6462d5</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好, 这里需要密码才能访问.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">有东西被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="电子电路社" scheme="https://blog.satori-march.top/categories/%E7%94%B5%E5%AD%90%E7%94%B5%E8%B7%AF%E7%A4%BE/"/>
    
    
    <category term="encrypted" scheme="https://blog.satori-march.top/tags/encrypted/"/>
    
  </entry>
  
  <entry>
    <title>[游记] NOIP 2021 游记</title>
    <link href="https://blog.satori-march.top/posts/OI/travelogue/noip2021/"/>
    <id>https://blog.satori-march.top/posts/OI/travelogue/noip2021/</id>
    <published>2021-11-20T00:00:00.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="292a59964a4dee5441eb158fc7b4d075a01535c920b34aafa745accc270439fa">1e841e7579db121a9c9d872c6d9be322059ef8ff3ee349828873ef5d5ed693775adadf1a3faa43a03cc78eec1d3bdbab4efcb4411eb0c59ca7f04b776925cd52604cace074d1e7b27fb7a7d4d381fdc19eaac4baec74b65451d3e22f6c37c8d3af0a8ffedda29d62c196e825708b3a01950040702b22aed98e1899037fd2419274546128e6bf264cb4356a421b493af2fd2a241ac7ded9be8d1f9673587214317c4e1e08f9cae36b06f4aaf483bf4239014e9c3828863bd8384e58bff2dcb6deba81e2dd839b61472a97d90d836cc8765e1fc691525e0c84e4d77f22a0e9170226d12b520fd9871e3ce970c4ef7808b117c66c63deee7e134876ae2c36156e3ac95d774e8cff704eaee738d104e176da90c5b3342102e6bf8769471f3d8d6a5ca2099e2eb232b8872ba1aa2251c9a5f61824269091b636c139f99f3744205b7483931c375fe2890b95a66ed459042a1d474f67d89a054a779e8e534bd16eeeef3f2005f14b46813f8509fc2183d182fdf7580e8fead7b088c6ed073b8eb9be068409463bec7e02a5dc18d19a2765c26a24adbbb54dd61685c0350657c3b5f4dcecab56883a64aa8157a8875d9388b9269d6c46d917483b0dcbc3a1187b03b10c031f7fa297cefd56c74074444a470974f7a12e1a6aeffdc45b26c47146bb68cdc8162b95568bd43ac69622864d8c08be2265d6ee4258110083adabbeffcc6b5e9bf97938da5aa7f0704927097336ebd70f0ba305d1e616af55a98fd212357db616be0ed38b2b74f2261d990082b3abd4cf3012a94f381cd0d990419ce900746ada018b7f4e4a04b91b3fdf14e01ccfbe229f6cac720344fd3fbf630ca13cdf73b045d9ea7c38075021f6a521b133cd5137a257a8f3686901fdf9d548a432ec05eefd3a87ce2ba304e30d27fe4883906dfda4572d42f9bbb1bf7a73e3bc9901e7ee580def30886d65f294476cd28f6fb14e6447dea82210a0cecca57406f24a3fedd3440b617da296938eecf3331e9f5626c0ef4a13df376ad7270ab5798fff5f5ccd6b68ae396e04fc7e3401794b7054beadaf877c1a61d9b4d3e4f649cc9fb5f7a6316e59af47dddedad57404f8fa5447cba8dd88b9b4249b43ea4b8998eda4e8adc60206df671879f10c7a812f6a3f9d853d596d58c7af0a96c6ba4c0a47a857c163be06f86bc4511c1f8b351aca8579e4f4b56ddf014c38ff2a35955ff39c441a13eec755ce83221c4c31d8cea040f544ce6065872eb3ea418337822b7810634578f29cc17f8c7d8801faa8b466b16296d7fbe7c58cb867dea2d249cb9cbdb59b7467a97a063e7b71f515da36ddf8ae6bc967bc1f05ffaa4e0404cb09e17c8c7e793a77375e9e6c61c8276a6eae3f1cff1055019963bfabb800295298782b28c9d40553b3d4760592bcf6342539034c0a9ca7263a5907a58015854057124273172a6cdd41ba0d0962d53888a68c88a5d6e681377186ee11bc0712e014c0d5d9b29fbd9a4825ef6fb9284708245143a225e8c23742bee32aae685dfb7390ec47b9dd7a70a7c63df737a57023151e597773a26cf417b5b83b2c3c0862a524fc4142b081752ff98d4f79247eca29c22fceeded7348c633cbb8beba349a00da2f143bbe595dfd3810b28f50934e7559158de4ebb9c077687cc6112fc501ce719ff238232c84e1ba02552475dc57d8b3f9332d1f8ded98f28d2157314611dc9ddc756a4de4a743e8fe52669f6514cc73075e0aa319d93cbfb3a831ff71763981dd01156c6d2f144e8f817ae3146472036b14a8790693ba4282d3c330f69f9a3398f77e98f772bfac787cdfea73f7cf16ee58963ee3dd69975a66b2438bf3baf0ec5ee03fe5f55c18c87678e2d273d66661561c763d52010f80cc674f2afe8972ad88707a6c132ddeb37c21c6c6b686870cf40c7d8a9bcdaa78769a57bbde87950dd8c46aca35f1ae4c1f6ea461a31741874c160bfabc95e92b323390b6e359062207de0f50edff32e853bbcba917989005400d529a45dddef6be8b260abea918c2eb042fc84470b47b5c865643bab702626b9b674d50c31b38feb5596dfc79b304e9bb5f10e1e1fc0c8c28033e13cd5a971708e27ab467c01a98030e4f6cdc7df3b84a630a3aa7f013ea87182d95f5fe7a8139c457e234c8977e43634896b70cf7b670c993986bf01fead74b094f35c96983627fa459eba77f7091c9912fab996ecbffd6b5c913ec4bbe28d2b2600621b4bf10c0c120948b2101a59090087f13604ada6a72a535da06aaeebe0ecbb972c01d7227501d399a8436240055bb1126232bbb9d89579d80073430ab91bd9f4a89cc090d14d2ea750c4ffc2966fe420641a1c8a81e9b1c7872d804e54bdd514200c64b8f0f5d0d7fd6f6c8c18f10e57e1945fc9d42cbbafeadf7171dcb2e962203e387bb8aa8e7182fc3932290e247980a0b480a03663ff73f343c94a97ca7d9c9c7986c2662a656ae79d657d94be6f018f590981ac677ec2f85f4854903ab28aabf2e1628c38aceefb1a09dfa562222eac26a710ea32268f8e20b3468b544914f5479e82ffa75f3de48eb2f6dd50bf9700c7083811d14436a0ec780d6155152131ab7d9bc8159bc56faacf97f3f09406cc43d1cb174edfa6bbc91b5209d81ee2ad0cb0e469df566729c15f249fced32d8a1849709980f565f15fe55bbd62eecfdc9efa44e31640892338d6592295f05c70e0c9ac7a5e6b528d7ff2d899afc7a8ded37dc7f6cf4473d8c2eaa5362cb10c2b217012c55722d1e63b730d42140cf298f478d86d1f9738c9c28796f84fa2ab88ab588605fc07bf963562a9bde4fe9ca70ec503d5a76a8bc2a159d5cc7c60e16550bb7de0a08ab76ca72f3921057190100f52ec09733b343b1b8a003df19b1a42f24dc6cc1d3742fde43ea4282548629809b6d84df8f84ba354ad22f3ea694fffef7a7a31b9ea4d79089be7ae939c913850115fe3dc27f79ce3b96166a78cb1734356b21fbf7075c267c314887df5176bb1768f368596b860db3102d380e8fbc1eee4a15b49427cad946b235f505e20ed6273c93883aee5251eaed5b6365e10cac9d588da104341ce1a2ff1b5030fb866f4702a4171888c7ed2d154887b2849e02990ea609cd8e12f068e5a8c6481e2495fbf612b2482ffcfeec85cde2bd5a31d426fd8b1c36fba7ede8fe9312f8f4d15715d8eb9454a11fc0347a2e84745f1de0c4428d1606e7bc223c552f89c4bdf6b01eb0a14dee9973eea16b490a671a3b1e0926f022e195485436030559087df39e859d6ab2f2c940f7162c1ad833f991bf45d581a918c89f54ad4c2a557323215c0616e9d12b54e33ed3fc3c66a73268ec9cd135fb9d34c4381993bb7658f9ea23047cb58ec84dd762a6f291e36e0618922c80484bd3660c659a6ca63d27b2a7a67a5f223329092d0c3ae8f720958ec43602be231f3f324833fe9b0248fb123fa7c1b248ae5a602343efa81b3c53d8ba95badc9eae6617a67d3857025380f1cf072727d94fdbf31710b047b5685a43284c0bcb758d95eedcb2aa89922e788bdc0fd1ddc2fc91018fea5825531dd961d6db40ce4b2715b1132af9c6c26e9aea3a4d88db19e76d13ebfbf30b7f7f91eb099110a495ce94e6a4e1b90dcd7d22b8a907b55933f5a19b436f0a6f5acf7a3d21d2208d7e624bdfbf3fff53c5b76c48260ae1738bdfbf8998eeb3d8216085b30b9cb72c1037b9e3a61e0c9faf489234495b62f12fd13167a4ff40132ef951db791d147aa23ccccc4f1325aebeebc2ac258096a4c73fee668708d47c5a069cf4e3af52a8b69a546365d7b5381846608521565ff569ddb23030181a0b4046e81af984686249fd79aa1b622fb508f2ba26507dd25a92e9a4c1d13c00e0e082c069b9dcc5f9f859e2752359452098f0fe9eeb3a168bd07ad4070c4095e37ea9e84da29eb209fee4a9d5c94178c6c60c8fde4b5f90ecff8d0fe755282c9bfcdedfce1238344cd8d2628f4c193c447fb5feb30a1937e337eb39cafad82f30836f91235a2518d98622b4805f2b9b8812b736687590947b534f7b0cfff617f81be42009c6b1d2d07e926b3344adeb7370eed39080d02af7f840026824d22a7078a8fe6c26992776db52119c433dbd6058c36f48e9ede07a79bbcc6b72c95ef0dc24f53aa3c616bfe07e8a78b413d7791f07d9e8ba4b9086299ee01118754239d0f8f99661bfe8378413b7e4286dc22d57fb904ca1e5878a4d8d4dce6699937cb5a5d16d9c5b589833bd8a200146d0253b294f543cb250a2c339df63ae93f2a2b57d05ad800a96d4b3ef47606e9110953c86fa1b1e082dacce72fdecfb9eab40d0273b9d406fea16b853d95cba76457c4ab9f4c656f7b3f7ca71025f434d8b3b7073b373efaa9b476df48868099756965a527ef575a14578a2e33146bfae4bbc08544e583bd50bdfc40391aabf94a216c86f62af539e5367e90fa4003a8bf311f29856fa4c6696c183220db82f87a699bf61f9f7438a61bde88c0074c8b7493a38f133c7fdad1fc39e05f92d90fd5d801e58d4a3ab030e4ad76ceb4ad8f024d6e16f2498487fd18864858ea95d47bf5f1388380d186fb6d9d3c1f298ef8cbb41fc01c8a39f1b84ff8f66c9da1e0234319cc2e542f6a7defbd6b4ecfc4928083c853f921db3d13a83ce1902a46ba131acb5a9a018f6053eaf5e2fd50034684c965ac8648fc416be8a8baee13fb457a23182275c10c277a206b5a769d69daf1ee8159ca125ad75f713a2b65b502853bb46e4381d4eef786225bb99e701955a3b687442c79f0bacbd93615011dd9e5b2391126357cacc1b0557e629360820633bf995235f69ed32f9d01f3414e7272ce0bc4b2f801f4c28cfb14f04ddc8fdb968665b15a1a5944a7b45fb56a7477a02667cc9552291c9099722865b8c9d087bea05ddf8e82ee9bb8a1ed9ab07b71c58d888b6866b8017828919abae8a758daf52dd58526a7a855f664f2af8e11888b0f3fb094087ff05c83ac747f32119af9ded00116cbde13b49525c44c3e7c535c0a837218594a06fca3c5ba53957f131411e5f506fe5b62d78d9f7045fad441ff788e2ba0d91124645a895c6939d785f44af71b0c75df61e1f6179d42bb3b5bf45d65a24f20b87185a10090cccf2cbe8e385f07f493e1b2e0c0b890bc9177bcf7d2202c049a2f62301a53971a18c8c259729495374df6ebeebe16014ee4fdd4eb1eb425c0f4f8813c02175ee793a645e2d10fc78f944d54bcb2707d3c3ace93d97a171c4a71bde54319161641a4e5782064b9ffd15acbccc5b65eb297248ce71de2ca531c21541288810dc61287fc64bb5cd3a9fc3d1e7b7015ac835ff837ff337b8d19309fc289c3d26457d9ccb164b6d76659fa851270afd6cbcb6cfcc94bebf97f9d0669d6cc6403a7e6258d2aebcc637f748fb1c13dadb8d817c7ddc8581451811e6182b364b32362737ec0940c4a867df5a4523d855835311e883a31c22a13e926696596f7852679102c89cf8301f412329cf26790b909b2d0ebdbc9f013f62185c1352be6b0e635b121dd828f327685fb2f45682b0ef02537bf5398cec82c741fb83ef3af04eb95ec6cea7a10b5b0e8e3f7ace3b42311cfa364cef409bd558eaea327bd12c6366afa1c5209260953483ecd0588ba6bdd8aa3763706d45554522d1b8df3e34204229e7b0c200af2d14592b435b2a25108a35f5c94d782688fda268ae6468417724ee816dea9c73b634bba8fb24c21f140551b095440575fd95e9163ad6856c3a2ededf29e5d4cfedb9bfcc40f4d0f42ec77ce00247cbdc6e9c46b5a24ccc03b2b787117d8f36408453b15bc2c485ff3aad275ed7cc6095a316e4744fec40608c9998467072804a7206ce0c915780367b413281d38c28ee18d721bd140e2bea9a6ae411755726886afca3f193cfc23cd83687a92bebcb6b3a933a064cd4d8e6e35d42158693f782da7517c2dd43d15aba7a830f5847bbeedd4be9cfc08ad290a7403e1d76a365d6e85212613b811e1c6c92afcb2407a621b7918591cccb63e892ebb225ce58e49d2df9e04b66ae57983686e11d2d3596b2aa3d96d9c455b5441392f3f58bd6a69b10a2445aa93c9cee48dc61cd2895736a85427126970db158a231d88b94def4c10cc0c38c6dd2e8025e8131ba76b7004ff1bd297b6ca6a5a966d8ec6efb7ea959bf94224bd38e677040023bb92382fa12591960373574b907955fa8cf4fa283c825d6998d79df296ece053b33332a2bf90559475d56127b2b8f804e03852371e5889e91cecd7b4bc03a562a3ec2962b179a0e46fb1aa731238d37222e9c915efa44bc5420e3fb4ad3e77186a133fa3c7fb67d4b3bbd463c5fed93c17c2730f51b413af2ba3a00dd26449e5e2b087d912ae61cbe0c2538d48947d3cd7e95c98ac87a4bc21fc629d47392b83b82e92a6093405d6b60fe5a66301b75e181ed4c6555cfe83a54be358eb8b241c6f3a7c3e6b0e4c4d4c19903a683b679e835b78d32c3e7e463ecd0722a21bc043dee9685cf46bade10903812af9c5bd18849ac69551a5661397ada09fe60b4b46e4d6dc018fb67f3b439585823fae9be3b80c06f46117e7aa33606a55f60c7241dbe2da651eaf8ce7216b3a74a821e079ec1e22ccf20c996323d91feb20bbf8bc39c88b9084f19a93bb80cbd5150effe3e22360f04eeab3c76da06eb89e70edd825fd1befffc3924279dd6de04011b6efacbd1d8d4ce93b6d2e940ff44e9c173a1e4948cbafd0eb682de5e1f7f17754b9144e50cca23fd2e53b6f49d6a6f77ef8c2c7f519a3991ae84f41ed43cfb753215e23eeb40f42275a36bc01f0b1641eab392b5bc2c22a3aa681d52f02f3b71e1b7422c5483e678638808ddda39e24075433a53f0efc895fc5f606117a13fe07958d36a14712cd58291e64d738a11a9447eef6281c59c56ce3f7e977f9793e639acca3a2187658bd76cd2b3277edad137337aec1859676f363c8c5db373051cd4faa008a806a126fa2b86f8d33acbfe67a76c7016405f05a5df3125eda2a5310aa839cf6eb3f4d2e564a34477c0aaf6699f373aeb9a617e762a189ac03e360f1f5e98bb6d78faf6be14f8e13a4a8fa82b4862b5c67e1636f9ea0b9bd3113369b424be4eb7e8f52ecca5eee7996f8f75f49b02165f8adef7f0ffc505cfed10c50f5f8e9408a66145d9361ad2dcd70a4d8b5b3d0961e78c11070843730e19a2967db066916334b233249a6d7415a92880ddbb2e45b65eb84788947c1ce63d902811e4edfd244f018eeb59f0a1205e25979b3c223706100f14404215d04dcb25d47bc6eeaec7258b5d7351ec8a432325089e90844dcf49529b5e1a568ebb526993cd89b615f2430b45dea2477197bd5131635bdae98b68f1061e6c035adef88c2fb4c85a16d92725486db22464f3bfb050e529fbdd02d5369b6af182dc19d3549ae6cff169b98bb3c412de2c07ac2c9272f7e00a49a6668f9282ecdf47aee752c38800aa5972a8d37b0483d1675eaa6bf2187c4d0c9f550f66c2671ca70eac2557cb607ee36374960f6b550908de354b43ce90887ccea249ff02bbfeffcf6a8ad124c067696ae6bd0d6719179cfe9dc521a30f4a0d68e49818dcbf7121aca9c1deb82d8841657347830c6d18de0914872e0303e0e43004dd02cb99e7166852e79e50afe991a1a8051d0d11a7c237096cd5f55f19e4fbe4f67b32333d79511dc629591a52cb6a7dd1bd8ddb54074f0a9e373f619120ab016eb2daed94265da827ef79b1e2a4163308e5d3c8c7604c3cc3e5bd6a4ed14f095563205c943307962060d8aa3f119ca0e1bb23a49619428b2ea56a5296c27817ac005fe2312ff0fdb79fa27f389a6510febb4f2d4b57b5d900b041efc1903de74c595957bad36d10d17a389d0dde901cd33a4be63395b976f6da440b53773bee7c245a87391820a94abcdd884da4f848a5ed8d2248b004817314046895792b7a7ff311e30afef487ee05b8f83b1426c0eac256e793f4740a318fe00181c4a2f241a3e36695c765b0656904bb79384de04f8e69a0160b16322c93f4759470220f425dc10023775ec39c8a75fbc483b3d1b8ed558b1bc334c8e2b65d388f1aa599a89264630f22b25615ae744b2e0276f1e0edafdb0c3050a1779bd0070449eb5a53fbd9fe32c9f4c180db17dc0544683931fe42a88e4ed20f6bd01c2ce87469c6664cc91d0e03df06f3337288d666bc59d31669b0050fe4dd32c335c86fb8272b617300625b2dea41a3e35bb6152dfd5e4023234faa0f4a8728333a590b5171f4b64634b559418aeb5f24eb18e6c1929b26bfbc7fb8614df9fac8bfc9440426a71b61719669429de422861e9ed3eb8dabc8703fddd2e19ea35770db773d7cd9a82b64a839db70376e435c2f01471a07488dcd436b7f7e63b6d527da454bb2780a9f8969bfec11b0e1af40cb63864297e35f8edf4d3ca35b8d989a54c020d6d264caee400ea54a9d375a631efca51a9c74d07a84af113ce3a164d6ee30b3391a12676d22eb30bcefaa3589f9d85c5382fb3619a6f01b9a377f46b08f1511d411b15c782c9c53f3b11b23766c16feb7ea731243b099beb01e177dca911e9f3ef335ad4a5c30191eb799a607a8096f3696291a9adbc1906dd5524530ae837e79d94888da703dc03998b36936edc0767f238352db6f0127c47cc663fa376c1bc97d09a272047987d4c8159cc249cd1806ecb28a67c7e5ff33b0a0a048e191c6699c0d21879d7bffcb2931e693e7654989c44ca061767c29b143602112691d470191aeb5101f010978e4aa9cffba3d214a35b6bb6afafb416cfdfba9d719c71168c7fa0de201762a8d86f4630394ba4d0679580e2002bcc4f255fe9bbcd512630aa492df59a5a5a857644edf15b3f2874af448fa2b800e7874d7a84acba74b6801b35c6cbb206e3948fad9b0b7c15e67acef7a0b7af8c1880641282ad3332bb4f0299528f716a720bc56706cc8659f3f31d080e308813f4265fe5fe8b6ed4ed4d250ee407643df5c0e9b12c3f4ed6fd98f4f41b3bc4c64bc124fe9ab411f620e7278de57619946faed078ca50b3c02c176a3c5b371a057b428dcc1452116d8214350a51668178219979c96aede1a8f95917fd7e48cc9e33aaa191b820d8e736a694fd442a5903b464c14e4f0098ccbc0dfb48d2f62a9709b6a9e13796f6dd4e7a4469f919c25264268aa1e4785372421ac37ad4b01e8779140d92a7aefefe4eeb367f4b2aa664b0d058d45ecbbb0d56144d722d72c8b297216dabb0b5ce5f3b7b1210ab9aa502a80a6a04a50b9824afe62f72530af87481355d6eaec21eba5d4c29c617cc2065eb6e70c34274b84049ea3b0be2d6d99bea349694bbce4d347671d3abc19af09252a2088ba96cc81385f6c57065f38489745a1d685f89905df861f3e540507f9c1c1889c469312c89193e0408c06899c57403cc21187e1189a32e7848858ef5027bbf6fb48b0021bb71cd70d10a249900d91758a8a9d0805e166e01239964330c6a339def138c0e3c89d7b73480310f557db7b04eec4dfdf456c1ee56da9664d2ed5b321b00c0b5559b2736cf2185e1b730e2c2d9b9bda0ef740b4ddf0af420419d6dc03abf2ce8fe4e16a5ed66e479e12a9ddd09fd9df68271deeba73a233ea01eb2b2f35743b8a77676b61f9e4157ba2effb96b7439dd74b80c810cdc495a30d7cc04fe607c1f162a3bf231f631924aa6d425fd49fc09e50a672e0c4ecc330c6fa75b39216f59011c09a6e808a10d84c2eb355cf3485572054cd1963fbfcedad34d8e11fe2ee274badccb9c582f4e519ef5e554784709674e9d72227d6979685ae4c4737a5e47191a44358d0d0aff44bf9c8071639812eccaa85114d344721d4d71681b12bf89c9d0ddc51e3412e16df96017de5e8cecadf5c1a89fd873b6c68fb2ad7ed33e2300710847205f63d375aa70ca9ab72d2e443df136e60eb9ef48c3e75e14d243d7cfccdf4d5d8a6fc82e5c03c0b2e4aaec5470dee8a13c43d2e03398e67e78596c7c9bce5d48ffc6443ed6a5f895a12548586c1c38e57d9a02014f46ba08e5802594346ea0ce6112ce0a468361b39b42a91d521221b04f9dd86276c2c960c838420fd812d991656cec699e30044aad759a32867f13a232da16cf105016d00f89854f61c32741db4866f2374df08c1190be8aa5d2c371359d14cfbf7c46f0e28d29ced0e28d5e842c332ebb34d6b7477e4fcb87dc63618b1290f06a8ab8fcd4189b59f4531db5782d8792759bad3a0ed3fbeeace92e102bed205673f49291db504a07d890f92f187429ae8ce36abaa770f783ed9061cda898db6073e9573a5441b9bfd3654142f813a4fcbea400c4150460de864dabe03ff68093e93bc8e29318e78b2aa0c8bf9b7716b920848cd078e009053d1e16f73f3e6777c4464dc26957189813f51b1ddadecde9c52ee912e720f04a604be965e979d76e7a5f9dcc78ed4e22c5077af9157db8fc6d113f1f6f1be5401101ffc3609ccd0ec4c6b741d1d8374e675d053a4e223b4099568d6d7368aad37fe92acda11ec0cb440d03585481fbbd71fa9c044b2c01425ee02798f2d265d097d4e58427d60d1da284447782df6ce03347d97a1ea965c23268ba25353d039aca57d904bdef3daac0dd815393d7ada6006fdf7834ce8822ab88eff6387e84ea2ccb6d6865e9a671b96dd0c848be14d9b9e564b2383fb359c269a26bf9a8473cd738601137d5a1b01b36f96a7ba8db2cb29ce9e3aace4443304311f1178c665f7e00a294ca3fbb39633f6fd7e1e863886b4e69844653b213302f9c515d41f6eab15b165e44b197f5374ea000ebc9fa44c675589275c97b64ad0d9e666877353240cf3690cb74aff4aabdf88a8d2bbe39da787e7f5d74d1ec3cfc38d0f626e5dfcb0f3b5e11d70a1fd9b653c0b30c44871c99a303ad44e79f1b96e43c53de405d074543438a0271ad429db2f875de381cbcb4f383b7142cc4b505ca53d8e67a422971f62aa9750df8eab7fdafe89bca718f80d87180382196eb1a893d34e4f9bd58e17eda759d41dee0dd1f1561de27123ee23601d6d51597482b3d2990cec13301f1ef43d2b3d0b37b48c87fa7acdfa6f42cf1927a9fbc5d403bad772f429c8fa92b024096cecff4c8cb520f48b1cb05930392c7ce26a4313b49643eeeed63d90e7d1a464767a18c0d48ea6063f754b0ff3df89ff0d44bca8ab8e443f2eaa4f5a722a771f3739f9506f60553bd8047feae335c78b1e770845095310351d9b32cd68e88e3c2afbe9d8bf68c3c6e5002de8ec8443468b1d7da4033091c3e69abffd7436a348f1edbc4e7d764b09e590d7190b2d371c8e8ea352c2b44cfed3f314886aaeade7abf7b4d3f022b426045c952127b83953bef90580efe6d61baea842fca086e8e670a2fa16db04c62993a5ac86bc5b99cbf1bac251662cdaff110904fea2e1eb9c2988612190105835d71b6d10689cab7a3f3a1cfd5dc0b525d56a4baa5c08fe3582698bc6909ef2e0969f6527b89e89458005a579b7ea78e7cab8d5303901ae2eaf81b5c0101ceeea9c06cbeed16630fef2561c4d2d9b02b7720f1b3abec66ac76d950d14f419b59e7bb454cd1c227e3f9dca3011f06961a779fd56825d59e6b050e8916e36dff2f8c2a0f0af9cf73709af5ab03e7a6bac53d5ddd6670398ee6cf57124bb7a84628bc920803ad70a664693d1df3c79f71cdc06c5aeeb15e155fb328ab7622a02386f0dc2edae52d6a33de9e63010b8970f10e81b699f733a1a99bfc786ae273aeb2a849207213f60ddee6e1d95a10d214c913f233ce10a967c2616e1e2df76331cb94279501beb0462635239a739df21d3a1df159aabed731d6923fc2445958810a3e0e60d6b28ce49a036cb3ae746cb725f36cd70855f4c6f8d9328d4155920e1300f9f5c21a9000a1a62671f52c24c5a839345d2ee4d49bf9ba592f0f58f03c0bf4a945204ae2d8b9f218473ef5bf74b8acd7ca1cc6de70aa33f60c4803c45e39fbbc77ddb4d343f2946f10859a4faf4d4fa47eeaa06d7f97cb284d04baf2ec9acb90f3718fed2a6ba6e7a862b45ebd7c6412cce183d1e09eddde17c873a76f92548996b79c37679fedce679ae0f4909e07a6428187eaf937975a30a39d4ede4a658ef935a37c6b0fe9055e5982078cc8b289a24103f1fee5db08e915aa2cacf7dd964b3d44bf0c29a5a2d4754e58a30e9d7d913e480d06698dbce2b5e4c86202d02358fdbc41599f46a8dd396ce2da8b3d4fd0a5781d1e66759c4d0a108edaecbe2257be696ed6371360d10d3126a0c799e1490ccec80e06b55fecfebb9ac6401a0451df25cc2febdf736382408cfc7906f6c6c9a097fa4332ade30b250a14b088e33aa84d9d8648f9e3fa0a9a6a280aa007aeb9b86262e9305378d21d29a0c03b70dd2a7a471ffbe906b8097b9060cb6bdb713867c64ef2146a31deca9a4d2b050c34617d75883166372a37d372c828373dd091bef71bbd2f5db4e0fdc029cc503e33705b918714c0ca8431a2c215fe45e4ab42d498369591993e8b625e7c0a239cbfe97557ce5959d301439fb96151e8748840720daf9bda42471cb413c75db7b8ca377423400c178cc2457b825907e2d3df0a79fe0ce06bcf7e053fde2c12a3ea4e46771038bc5b85bd73a13b052bd47de573ad515c54ee4a726b2dc2001ff33a55efc12e3fd19d983d279bab39d6e9e7fbe31608d70070c0e9865afc3f8836bf3a413bccfb05750ce92745b3bf42eb47bba4d3c33d3af7a54983b44f70b7e4798211d5bbf162bba9763b620fb953f517594ba0b30ea71fd98c6e23647a8c3e0b7ee44a2ede8480ab17c8930d0e46540f62a8011479fb07c902fae49e9023da699a3f2a153dc2c22e8694ac27c8e5670bdef706793237fac7a84d9bebcab0319aeb3196f47719cfa9e5eca5fe01605908fa612e16b0ccda7f5c1ac031e8203e750e9306d95a88ab8e9598ba1e50f0fc144b1cdfae07d2b5c70062d328544b478c865598ff85798eef85737b1f2f64d0cbf732f088c96aa2bdb9019b486adee8ec50139e44fbb89c306032bbbaed5227393044c79f2bcc950e91e77860c39b73866e5bf44e36ee7ca2ec5d40bde051d2b7751c8ba64a324c6ecbf5338b3dcc599139a3c279da859d86c6598275b8b237eee8afec32f61e915328507d0b5a9c851c2628fcd6467cd0593b6f5eda69961d25bc0fbb7768078ebd624c182b573bdc775d02607cf25466212aa65c22094f2083b94c8b66ce2fa53dc9eeb00674d8e2a033d9c3710d35a6515c7cc4d1863d37bb64bc67ddb2f0658f683442a6eccb36e65afc52edf3b6d0a9614b5a7d0b6d48e1cc9ee347cf1197321783285238c1a432cbdb12d8d1d2d912794fca9d38adf945af31f407164875ce67411cb6724c21b0a98769ec6f057bd551c9347849da9531b611cd0988e95d89a6a17590fd51221a4f6ff1e0dfe3fa1d3c5b5bbcbb763a283b6f2d416772cc6939d117461870d42f934935cacbdd2abbf426c561c817647bbe444aa7f7ff2abd1dcffc1e7b0e0a1c8a1df41e918099755a0af2a07426473643f5f16636b4b38fcfe0086398fa37775ceea606259673d786fe5afed260b8655566fff4f6c8dacf94e9669a24979064f64026748577ffaa21808c5228d74c2905b9e3f348675cd80363cf76af7897515889018a330e9751d78ae81c4657614051ecdcba35079cd0938d6c1c269dc4a8499117d99cd4283780c7db7337af33d41c9b340776d3c01712f4d44c10efbeb2e5bacac48a8fd6b89ebba72375e40166e56d6047ff21a6b2bd942f94bf43781f6e85121640c2c90741c04a46bfede62455666f6392a19680eb013e0d6bc868366352ea7d1870395de095ed091f5045e4f0db0cd55584f0d00159970b0dca232e6917c3f760ceea311a006838f8547025ddabf53fef4ab4b2e6c6bbfa8552969e90714d0cbde3efa111a03a6c14e345cd469e00a306dc733e91c260064d5a311ed3fb348aabd8115cadf3b28c8ffbedc56160b45ab789dd38b8fad4e755eb9e2b512ccfd620163ff5e12e0cde31ef9f077cdfaedde23ae36a2b2940142459a40b7099812d0e36be662bd8a0d68a2aa9f9a0bb157afb39d00937e60f4fb15fd7e3e6162acc408bc735f56ad432e00165cf5ba7a1be7b01bcfd5adfdd9eb7f1ea47b7cbb75ce5dfd8a0de18c1b9f991ffe3f10c41ece710e7ee67fae897cea94ae1f41919644f8209be3b4987259dcd43b9c26c97919b881ca75235c0ccdd00c01a60a847f01970f53d366c34d1c651bba28d9e06d423c8bd7087f4c07267602b71ac0b4fb94fa8fdac4c5ffe2eb2c65df1c3c7aa1bd9d96b8016030aacabd1f026a44ff22ca532203466cf38491bb5502cd76c5e5e5075a39ea8eb01a5d95aea40cda0557798e736cea65701c91150f8316b5fc2803cc66b05b65e8cd83ab09306bd21a066aa5346fc58e83064a70f56b5685642e46cdcb70be555cd0c31af2488d789dc00a219b5c804662be593ac70e863f0c112c91352bed1ae754c65994db8456a537f1574e9594fb2faffb31de3b9409cdfd14aebdf88cf809c312544593e4c5c22aaf5f2b5722eddc47a76e89489ab3d9d9b06df14f45c300db74f2aa52c5c8df3161965002c0fa95f02b3e80039d318c2c0a649f3029a90e623c16367690d3a2f72ac4a82f99d202cf4b243877a0772958886139d018748c853a7c4b34f2ad12ef21a0d793f9cfde87d0c1f73aa8aa244008a54b6ee97b90eeb4ee4addad041a68f680a1fb3973d822f29a17a8e776e6f12a2a8a009c4c6382f911b88c40c485450e7aa753d26377b993c80de0e5942b30c5c21a59598c6b0b8b8496c7fc01c5f5feee13e1d0b69d48468547978b82d4b77cbbac7ea097f5cdff67e569381fdedf147ed3a7c7f017c2a87914e0217d41deaff7a3e0bf01f8e7dcccbe2d0ba73d19bfffe2d97051c0cb628d191ec3c1cafff0ab05224f2a851d7b52e819f506163ad7d8949b972dc266dc87e885660cb7a4aeb2591a99598a11bed03f3da3efb15cc7d4f1d22088ccdf6b8712b161fc47db074095362b68e267f5f0194c090bc7169fa2dd9819481a327aaa7411dd8d10acc75eec6c35f9d51db4a6ec642fb8d5a2bd2ad1a1f53a3ee5f2e72027a128d4e066a90a3a3b0185b13c03882f6ec071c1ef423f9554bdecca064fb6b5d39f15a31d2b40a1b3305f65290fed5708e85e6928c963fa0adbc52a989118305ce923386c7fa4c9ebc44a199e10b479eddccc9b3db626405255173832d362814efdb4790c59efda86ad87de2718b87d7540e1db640d23a0ec52009e573b48f45e8f694cf550c193d9b0b13c443a0073a89de3de0f42c3c40935eb19205e1ef898dcaabcbd23bce0f70eef784cbcbe1c8eba189f11150c3fe499f8abe3c173e9e6c1a2c3507392ed17922e4ea67337fb4b43e8e431a62d5dd9e97ead1258417aee6e1a187f07a3a6fe3997fa7eb20942051ae6dec4fc10ed854711a89c2695a7a7d7926c045fdce16ae8c68e0ac6620503d49517dba2769c772d5ecbfec88f944fcd81a28ae6c759fc5a16b40360b9030b39f26e644e568cebaf535ab154decaede553e93589849eaa002a55868238a3afd9c8e40e58db05f23234454c9930e2fc182cb6936707bef621c8231f23f0277c176fd3bd768602fd4d168bf127f7c6b3bd042e56cd4b31a1ba4d80ff8030a5b24fe617bb2af4e864153ae999699652935e6d14b6f6ae6ea4d6989ddf003117fed9002ca075d7e362daae214178778280ea7e4365df873dff0635eb950674061943cded3ef579cc6bae002e67b31e646c6fa00a30ead32d9f7588982f64d2f522f8aaf4a934ea71d375edcceb4346d2589692b69c2b95b510280aea306a03ce1bbf71f558a363c49859de33a7a43f42292628195f746214018d5ac4d5d759e9bc2ce1e15e065bce83d4de409806c99f30d4886705ed66a2b4cbd20948204984978848d96b96a098d9654db564672e7866db924634fcdb310690d2e0f5a0360850db5f0a61751c7fa2e75238136df019e16e7cb2a1061e3d741f8082cd6ce022aa5d65d055b45169d96eb66bd09ee7cfda1f793cc7fceb28e12459d02e32f18a0384add892d9c8c7d57d4a81e76e6e2e26c73779c0af1a3200992e4a6513afbdf6db28b573e2d17bffb447f5e8629297ee1f0956f3489358906f95b0cf36a6683a9ff70fb4e687e6a8aab004915510e57736e54033a77a504703e32d5e450f7fdb9014e444b424e61c483a0ef14466ed1b7429636e111f609ecaa7ee6552410365a9cb6a4266ab0f5706f4a8c2ade48c124798debf1ab3aca0d9c25aa09235f0e84f4c40688ae63d3ce8237c6573bfde976df0f4a3a30bc5f3f9977abb85588d83cbcdb11f538f47de8956b47ac373f20d19053af00324a3077afed6ddc371f088c219056ac4fcbf950c0a6487718872130751204b958a6c7e6ecda12e5bf8049c7357c3f7c9d290f32c7a9441a4d135ac12dc9975099582ac060ede0c949b66f7e677d5c1ceeeeb64b50e726956550c6b60f2845695d461bc0d509237180ad893660dc6d9ca95aa3e2d9350fa0bd376fdf8a995517563b4fea745f87f6362d06ce61b906dd19e6969b6c23eb46de7e176df3bd0c810f4cfa3350ffb74d6f5fd924b11d8174f5d896c68dc7d818afb1c90f90c584d017710f8d15b4152fdc01098b6c3fabc5f47b9fd7ea08283c7a132f124b2440010b8eb1d1b8eb83f7d9fd24f0f44e5d5f73817e5fa9df0471210fc36816d6fe949c7fb3af77fe0495c4a62fd31cd9ae58c266db83c15b9b88062d001db42ab2b89db86c973d74cf4460e15b8674a94fb1d699ec11ae313b028a135b95cf1ee57c966cb6af596cc0832455df76f7471a579e7664427399aefbe3720e1015000be8f642c3b170fde42a1ab396e068939919de04d52d62702776c120b2f4d362d593bfdaf6599d7b87739c34473a4d8944a8123db8285d6f2c37ada89d40ed2707fc996ce40190fa9db2996690695243c996812cb4e45fbad70c108e35989c825316522fb8983e226db398d1edd51d11c00aa08285e56ba0c9d06d0ea94aa60487b5a69c9fcf9f810d3093125dcf5a3188e2a518027214cf65a829811cd38171a8117ccff7186910ed200c71ade2ebc0f3e5c8f33be82b370001c6c9010f55e049472a5d3e26c74e702fccc9e2cf3c3c417da37473d8d48275b4a16f9da2b35de029b2b4d95eea30d07ad4418a5b211e87f277070ed37ef35862d2c31824cecd6e1b5a76c33b25c4bfe81be67a1418499a2942123e1876360f88ae01e8049da8362514e65490e485c03b0e9f4144f63aa46a4352a1f9cef980078224615dfa067c8e161a8e9070034262e6b1ad43d3d8b30c3beaa4001c8d2273c1cc79c065a7f59bd60260425e2bfc8d0e0c2b93af5d38499a7f4b8ccdf0d087db98f1fe608663026466ad88d38d634b235a2a2064518a023993e2bcbdb8ff48c46b4a7d6a57ccb23a84b32fc956365c3a3c473600ebe03d255e1b5b9eb81c1be91295299da5e833d4b8645f6f5310eba438a34900a822c8281921ef116b464ba1a221055a1aff1fdf264e47f57e577622866e329574e9e6b724164d5e63f66594b6a9b0f7232bbab9373558cebdf66900688a0de635e277793fe6a07bdab549cf101ff8a759dadb061a6875527c1992c474009d47234f6130382c6c8445812082032b202c77f3b25fe10fd9b7f3e651ad3d938adf6ec17d7addb18023d587f4200adc2fbcf2776be88e4ba1573c1afb606b389c77673969e7f589c4038ae8ae817ee1f8c2f01932147510ea6d9d42c040929f0eb4df53e1d710f4afdec492b6f9e719d571e5397707074c998458a06d4ab3dfe5716456135d5c93c13c736a1e6e3cbb1c5b847026eb6e0fa99df9a17949cb798c480adc7dae0a7f595ce8a468a7c0a97baec8738ecae837b199b6c9dcd63fbd8d74dc4b091a603c634644e733b19dc7eb53a526bdf98f2053b82ee1cc60a839286909a4c0f19748583c443edee6080f0e137f75ad67fc0fe86af4e8e1ac92c372a47394bd399064acb25b0471e21a6c63da1fb68f73ec6cb961d4628aa77fc81b0d9ef281aa4091add0b3e498baf36399627ac8d8296f8b98e5cffc060663c9465f0a01bf7cb138ecc32c9a34ad4ebf069890ad43bc59c0d54d05cec6b13ab5d605a6a2fde14d4ed4b8042cb1cdebecc1fc03af18f6fb8b3065a5a67e40c55019ddc127dd6d8f944189cff71dd45b15dd017eb4f3c9ed53134d9856fbe595cb5e34c924ba28226a7ce448248b6a3a589af98b47877d6d6b42bd56f31e71f9217a0810fd5e0902c4dd80b3957ffdbb3e32e539e2cec4915947d3120de378d733afbfce8e887eb2dbc99483d6ce2b4927d292d382bad0485d1ec64a39b6ac353455da86129ad6525c796e531f5df087e0414e19ced5daecbfe94bd6e9d3e08725777ae9001a0ec89e98ebbd6a9eac14c1bd5b1ff49a7b6b1ee8662ea083a9644888391bb3408f3e5192835d8dba78277197f3c5564dcd98fd309fe3e3741ec26fcc4928bfe86869bb4784851c400ac3c23a265d7f27c93bd835b8430cc2a016f65cd161cd94d66d298f698a13563cf65bf6247b2d45883c231a3736cf46bc1809f6aa0ec12f6c94498a588eedb8c341e7b66d47904480c1f7165847e2b4d85fdc9fc1592c607a2dbfcc050f571120bba712a22525b105900c3a668136bbd92b7e2d06ae01a1aa91834650f30b6ed4ffcd8f63d1d143c3c49b75127514602b4b27c12c9dc3b5caf500f431f31d0ca7d4ba37364bcaf873c8c3fcd6677b542fd3977bd4236c831c597f1871f12e7843511ed0ff9ab2d70fa8a68f9346a6fa17448ecb011ba333c6a4d0bad0b7e53aee7e2314a53abd669c98ab5f0c33ac422db691fbb85c434838026a64ebd89aff9b705f4d9496ef7b8d9791ba99a4417831c5e8adb272a1cd2b64a80b93a92939bc508a6239b1d7fb35ed53be43badd3ee068116e3150c3bdc7eab4fb6bc7115bad571ea938696e97dc38150e6c34e538352cb2030d68439c77a733ae56ae3cfd8cd76ce6b61fd1421a0288a266c583c41fb63ba46325628804d5e0c5bb5490b887fc63a59b3f47dd24d1b4bde548333954e9b7f5c66aa005e1034d3276fdfd54f2a857bc9809a545cac17a8399e1278c7c34256c827a566d3d9e1ddaa156e79a474da8589db26450c158a60a942f818ca147b1ac93ae316525217205800ed7ded43719ae54cd3665478261c8161e199156e388d26b6903cbf73a61412bddb95ba05c13c040cd7f64fa7fd9a2aba5feeb85feb0e539c2360325195bd7ccb68ea2e10d6a974c081ca6d1fe7500cd480c058890156402953babc9f3713d83f8c89be5de3a9e8648eb3feb6282d01fedda28ba838965ced74e3799aab525db1d1e3f639feca426a59580cd6be91f1748eabaaf777ce565efd99b43e555749c51167adc21e7a43bf66aaaadf0e8e1a2bc33a1cc433af87d43dd70b87d9db7aecf5d9d89f4ce31d8b054a6225c550d6300e320c502958fc09dbd5586abfb4def80cfab9c554bd7922fc9c6a441cd63ad6771badeabaeb7667e07149a63463bcfc450090552fd8b30c9e457b53f480d533fadd02fcd7295e3409cbc21f25b83acb682fa7ffcd5d2b1483650b7ad7e8ffb2830d2f5ccefbe336964807064c055c4dd6dde00d94098917396d525fa4b506e8d7a6c88dbae13f05dc0751b930679cfea03f48fd73b622d9841fb632416c4f48e2b20e62bf38f10369004086e024e7c968425d6f8c7df0926126e8edac9920107db65d66b5feecaa4e3458e10e3a9a236687f87d49127da463f4991729a4481aa14aa6e72315fae67943068994aa5a10deba891a596e7e769cafe9384068ef69a7e560cc5f73765f6c5e1de12158a2cd8f6e9543aae053bf9e693b9189e3e1c21bae60166b24a2dea6d907703fe271ac4f8937c764ea47f91665be3aaa2cd0517e5856fb2cb5ec3cd29f06c24ca6ba10642fce1c2027ee322aba1c653c66c72dbc31d16661b3512ad78cd2b6b6696192126b185ce15da0b76a6d440c07566d9d7f4bd5f323</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好, 这里需要密码才能访问.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">有东西被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="OI" scheme="https://blog.satori-march.top/categories/OI/"/>
    
    <category term="游记" scheme="https://blog.satori-march.top/categories/travelogue/"/>
    
    
    <category term="OI" scheme="https://blog.satori-march.top/tags/OI/"/>
    
    <category term="encrypted" scheme="https://blog.satori-march.top/tags/encrypted/"/>
    
  </entry>
  
  <entry>
    <title>[游记] csp-s2021 蒟蒻爆零退役记</title>
    <link href="https://blog.satori-march.top/posts/OI/travelogue/csp-s2021/"/>
    <id>https://blog.satori-march.top/posts/OI/travelogue/csp-s2021/</id>
    <published>2021-10-23T00:00:00.000Z</published>
    <updated>2025-02-12T18:15:49.000Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="1d983111aaeacded277f546954a6046a13e7aa936f4d200df2318362b22cd80e">1e841e7579db121a9c9d872c6d9be322059ef8ff3ee349828873ef5d5ed69377e2353c2271e881469f98bda36ec5cf1be1974ae6a7e965db77002c9b14416f13610ba2f39898b8502dea227f6611b2db2ed35d658cf7241d1ed2f2ca093a24f6f081fdccfd7b79aa2c1a60b0c485509312382703303ae5aff728ed84f38ce646b69cc4560e8cd1e4043aeb9acf463a5ebea885d74e100b1b2647d95c287a114728bc9e7c7f62de1923655244b108e187c3fde0d5f00180a52723e03874a7406f9a886c3bdd28bcb4adc6f01039839bc5474c17d07b33d4e40ca53a609471265992b48d87d8d46172e6bd9e06a6b3637e3825cd7b3c0f9f10b623fb8ac6ba392af42b88de52868926a6a3d54e2a30bfaec0657011005a751206d518ade56eefc96a0af380d359ae4353b08bc962dd4dd5c56f3f73144f598a981887b42f1be597dab61f882dd6b369124ffa9789af6d8cc04e33fb87246f119845ffd4f48ec6ddfcdb35a10c228f6b895c7779414525598808ac08d67a44a87b6fff80b5fd272bd7d9fd422842b2616277b59997153577ae16823ae1e67207069fd6c52ba5c8977366793e0d10908ff21de6daf666743883d4dd63e0e1edd088e3bb14d0e6dc36a754d0ee0c773edac1b68ef42df5d4756ad96c61884377fe80fe79cb949e79de5c9231bc6f04b516df36a0b3f071d10da798a09dde01d2c67402bb28628c0b59031841807135e8526afbd7ed98845813d83b19a6adfd93919e23298e2f6d82a91fcd0c3d89cda99f37d39ede1c7cbe64817d83f80a2a51e5007b30121cbc71c57d86b813176eec8f88189a5be4b27d1201031e6242b1d06bde9d3a66b8c97cdcbc415991cebd552b50eedf6f4dfcedb70e24b484729e2518cb26a7f2aa2c375879928fd2ae3d204b1e991454e435e29e8677af790ed1ffe55c83e1b68a6faae522670ac9782ac5c96182455baeb4a33f48b80df8d844d069119a406104228888368bfc415ee8aa81ab08730a9e2d48cf0efc5f6fb762c1550a0b564a022fef06ff6590be707c1b13095acc2c8fdb3355b61042e83a667314a094794703f937f29adc781115ea0d82f559a68a1e0847743033a939891860c510297c52b12873a08917d172ab7f6e0aaee6dfb4bd43623e71a17ad2a45918a7dbfeccb4da1b95ef29f1a9a1a41dd1b79ff72f7ade419a87555095db60265abbabdf8c46ee4bb5e5494c8166d53efd8fd59e3ca35bbe66323b181287b70005e63c1c12fb4740ccbea3884667c16fc6d528482d428f6d7fe49ab4a580c6aebbe3286fc760cd18f9284919cc50a08ac47003081b94713b8973e212faba994dace168e6dbf18a735ad498837356269d32f7e4fae690290a0d4d377657cc3ad4cca9930e8c48f46f6f94bbef906c2ce6bc1b927e798db9a2c32a73ce73c74b1fb26871b3f1b844ba0345ba6991b924c826322695c7d840887bf1cfd145c256fa380004f450cfe15e4dd6d20f1c54fe8d407b15f3feb88e7364eeab2727a606cd7a763fe5782237539090330b9110b1067045337619647ba93367e9748672127b426616c5a841f7b0ac17ccaf1aaf963c69a1d814697b058c067abdd3b37b5fdab8a3d5a64b1dbeb1a80ffdb14bb108f203c9dbd40684f18461f1627bea0d4ee4e9ec933711ab2bafb06ccdc5a33633853ca9b3cc3aed92c2f0d63f7f16bc31b4751f1a23cf21c1f7bc5f52006edfab4608f8c02ae91032aa21b6258a952b4483e5836fdfc09643cc9bbb206db34af09ce97621f61a969f28431ce3a78673240c37eaca0f0e4992101a225688092cef389fea39b080a0be4fb808b180e792d5b4a6b0de506992bb69875b898a47e2fd235322aceb9fc42a67fdf0025ec0e90ef3f843ec2d41520ac9d3d20e1f01db49c2c89411297cb2630dd432451df94995d686686db0b0c4d8ffd48edfb5ef6760cf94522127fac7f7da27dd54e490b018adceb28aed867fe42afca723f1d21646773e7064a1132fa5538a0139aa864a126eaf4602336de89617b9fedfa8af4ba7cd2f6e876c7ac93f0119f07c62f33ac1f88e006126e08b3a2975ea3d77527320bb271b604d430e6cd1b37514cf78bcba8ef8e454152abc88c1b8c8d7519202347333f4bcbf94704ac0375425831c3f95b0500453db79fcdc793dd5c0e2cdc3bc938fbca9e7f1176bcd1b48f1412499cff66827a64a3c1af87060d338f6553b628e21a5e58d12556818621c28a2ff60e1bb025d7b853e79ceb9c4a7fa34e32cf8e07a6a3a524db4a1ed173ac9fce14ceacb17fef99b6ac8ebbcf66ab45ac06f4d9445f054d0ca3a2008b695f5e0e0139a196ec088a978a225d1e9cdd2a93d37e617ef8feb1ce268456cd26a39bd314c690b8b97828b911941c1cad36506d336e17155e09f2b120530c6f2fe6955a2185c5aee0500f33854338cfe6b58c2cd62f50de831a473f36f2d54b4c49d75adcfb824cc1e7a4ff0dde08d08d03f6a442f3ad35170e962d1e054b0a3953b5d059220fcd40df71717c3c07acc82f5691e8eb96691013a515d409542fab441cb34a7dac08ded7888573f909a69a7a4403b6ff74c59867fa9440c13a56f0ee058ca94c832dec934937f2fe4f123d68b907cbd92659f647c3a0112943178cf0f3cf7ea0d736b6981c2557ce93ce7c1934b8c068ba4fd52ddca6108c80db46e5d232ffac4393a90f8323d3d29a988f9b3117eaf9d78bccb731a7327556b20e5d61854b1f95d1ea7e4fe1e390839daa9ddfc704ce52aaeb6270c2721ebebad6eb50b8209329c7a501e96e50a8e70ee4427c8a9fb9673d6e9b18d3e53f03f8f759de1e1b60fe875563fe34685289e502911c7746248f5392d7ff4580e10c5e8c35228c6464e1ca9664f74064c76388e7c4315fd01076afdd089eb33f94553b23f7d777dc28ebd3214bec7da34f70d17dfde5270acb9ec45171795729acb21ca97b112b2f373bebd9fa22519aad700ac95c296443ce842292eab8d7e363708ea334685cfcab97902996f459ac4e40178d532cd1adc20e0317fee0a224a55b49385e6680acb0af01dbe3f828a3458118b247b654e6997fe1eb6d83e37bce9b8bc05bf99d0aa2ff0e9df488c5e20c75daf64c6458f3af02226e01e8b4451e4ee339967154093cedb47408f3784d61e52c4e169b3dc5b8fa55620cdc18d2e183434c430f72f19b90514ff29eafb2c3748d12710ab8d4ec19783b34720ae9422c943f3fc68606cf45d2d5893b6343e58e17892bd95972c9a33c8fee7d1d4b36c62fc0d4cdc8d52b66c3e4da9e9f80eda119796acf51ec51811dfaf6d8c68ce756f5c4f129594dd45ea6bf7d8d9899d0d8d166b23e68e9c86e74c3705b3c9190133ee6b9835d39bf5777b4e5092cbed465844c5d063df9021863a11e8bea6330ca79a81bb30170b67b515a7138594c7fa97fd3d51f4dd362ea1c3ae8d5fedba03daf8b9f222b9f71aa65edb890a4c928089036d9d3deaa2c46ac50e7ca378d27eebd843837f644bc45d2aa5022d791af8441641b22ce1750b259a3d7449a6a16d389cdacf0cc3a2c295849ed5152d46d2c1cf995a64ea8b14b82d0b85209bc785fbf9b38e06c24c00a025cd9ff16e9839f75213f6ce749562faf87c2e14e1d2b83d6a925bfe99d698eb3ccc671f74708b714e3deea8c65cf385aba174c00ff5c3b5f89519daed867392c008bf5ddaaf539ca866c17de03df18b0984a77c4ec1f33cfc58c3bf8e657223d8c4d7644713e2124dabdec0f800adbaf8e516b05677470a398abf4cb07e241b47104016c4a9a07bce34f50b3f97888d9436f79f571e89d5278f2ba0679ba83bb93c233d85751b589b1ce8cdf5cef477c99b5200fa4ef0910e515a2381008ecd999f0b11dbf37ea36e42d40139f2cb5b87b4515cbfc8147615808c8cdb885cb9fffc9159c1173bda82188e45cbc8c9e5ae05ae9a5149c7c55b25a5a67cc56ff6e8a57300d5f84b96228b78433fc7c604178ed44f5671f7fb190fd4979bf1b313f8e3ec48b3801ff7bee0078887c8a1ef0fa22124364686da664cc47a21be234a9f99fa6594221f223ee884b13b090d203247cbe98fa475c363faedf53e07b693f476f528c95097fdfe7da490ca85df23c8a569aa90141a9407038e8c43a34bad17297099671f8de2d4f64a0d165302d7a5228ae8a06ed58a4b7b0d67d20973e931a65eda7c0a14de91a9d1e86555807dea2f29a93844a9753dee2f899774af12e916280009935baf9b2dadba8a00f29a9131dd6d9d25b9af865a73e118afeca17e9c119b1e73d3720352cbde95c08d894113595991f49ce38e1e13ec2b04f632c20d1656f840797728817a9a710ba6229b8f1c79bed8f4d2036297dab2204d5e176c4e3f7b72fbddcb5a690367efebe53a1e67e01f47d409d69d79b3aaa830ec2645461ca966a147f4e514773eff375ae5fc975c339c3fb36b900d100c79a56a2500a0ba23a796ea08ccdffad6d28f6a29343fb39a884ed24eacb755533132ba96fefed140e868c24329c7354432e29d72727c2031e1c98b761d63ccf31b96f8586df218e8b02c5a686963fec515336066744d6fd34d76b176ed2171efb5a7c2452275a2ee4faa3db8e78a20ba5cbc2c4641f172f9de171f9fc36b357c08064ec19ae61a00c322a39f51922bb5a0efb701047beef75da73e729d5de4ba1cb34d979d6f03e5b8816caa9d7d7035e1fcca6e1e395b59d6a1e302daf1cdef7d481aa44c38b7bbe5e312c8d6a58877fcbbb2c92f4c994d23a5bd72bf258bf53315de10db2bb29b873ab120c95f7418b3aa31986770d87088fca62b33b110371e121bdefeed03876807d82719be70e5597ec2bf77d358af8a2fb18ddd4e95c6c69ef48757304dbcc027a1e4d973eaa467425ff10248fcefb10ddbc3fa47ef12809cba30990eecbaf631838a4f3cf23d691015c4dc01bc306a65e8745ee215f341fa2a76cae2d560f3a727f0eda1130ffada394bbe2d3b6dee04c2a4c4b8a0d8cfe9c3d6c30aa29b8f4ee5ca0b795cd4a320a21645022de03eb40d0cd2503fbaa1b653f34b5f12c52fea22c8dabd73f0fc9913f1949d166411f05af808108c5a2f0c05c54866583a1022a08f3a59aedc9e6de2c3f833e59e283cfb12c0ec17f1d9ff2117998475059e48e278ed7115e43fd02ea902cde242f5684a53d596753502ceb210a80122eb7ec88129e5368e744ac029c39113f303e23e85881448e31b3141fe68e84fcfbdb5ca44c64592d40d9cd233cad1453620b556eefc67210283b7f15e2b27d89f1a55d4c158071afbd930c28d670a4fb5a5f339af243b9186524581d1b6b39b87c44b37e7540a6031f24f245e17bd87171e18069942788260585bdc9fe462e4bbed5be73eddfb1cb4ddc3ac0d41c808fa39df5552f45bb0675d67c21386419cefa8267528bfb2dfd9de0722af7e29b0c9470aa2096f7380061eefb635802a9d0c127c5faa8105d1839c863a1a27cff787a5cba43839d98c98f1174decd36ca0d3a3ef9b65f88c364a24e4d71baea7c4404c2a0b897b956a525b3b25f8d6ac8c789d18813cb1d45642f5e2823ec605f0758247256fd4bb497c8b0409494e53adea734ba91674e56d8ea2cdc752ca1129791582aeb9357a4dee6eb252cb4433a7773d7d9f9165813d89468a141f58846c6abb1fb8dc9e050408c8d4952176733d48e2ef33074867f50dc83911c0b8d53317a762d2b4cb5dac37e220c96b8db2bf94bca8c7c375af471c53ab00c52e900dc7126a19f62bfeb6497bebca627fe95d75c386231fc7650feffffe0e0860e096250e072a69550d7fb150ea7431eef19bfa294a64481b7d49da727ec106d7a4bccf3c5ed025a971e988d45204fcadcb0dee609186bd2a7a04d21b72edf8c53602a1c119cd77e7828008a30e8eb021e8b6136925eaf5dd2fa22d39bcff6b47d7a4b4bc5126b6fa766bc9481685c8297458d6f5761e15cc3eb43b8521b69fa566fa57982e729d8ca46438650aa4fdac55afed443922194deeb233f5944f72b77214a66c69f68bdfa085005cafae212eb1e7a7a847eea6b43e49211a0e8368a919d88f636bbc6e12466b65497a4d112daf0752c496cf60beaf04e2e38db70ba1d7704fb98df6db86f34d5cc812bc7f239f1b8c706eb32cecf22088ab63b4e71564a5d4339bb7f3fb6ae147b736b046cb980515c12d9ff94068371477d49b0993b96f7d842a4e0b60e0d58710a17281d36b48668db55f0e359527e96b224df6b01e6b02c61f0a35f1ef9ccec92f7c19dc509b756894d0593291df783db114f48e354e9a0904018188c1735d890c67ae135dad0f51149194edb8ec5e7bfe28742edb74c35d4530479bed7fc129fdbf36db543d20d222950e844810ca73e8e54e66db83d425bb2caec909e71e2630a1b4b4b470b5a97ca6d9a7553489e81c907d86c506b529db5595cc2c44ae8e850e8059c6f9f973e887ddfbcc8f9d0f7c8be484cc3c675705291206c42c22d10d422abd89c6359fb33543f5f8c280cf9ad3be1730e2713c9658aef4c9a807da587aeaf7bb72027cccf3bebf723f629cbd896a3e120d6e9b4e0ddde0e0f885e2a61b71af68f6ad7df520cace72fc54b4ed71fdd7767fbca991428b71e547322aa15686c2bd9fc579c7db6babd81954bce7d352266735d328c5904dd92e47d8896a9b06e41f2cb5d2dd3de3cc8637417d6c4207f4c1ebd4f51a4abd972c5fe3259aa6d048d5640342a34fee4a8bbebc9b111234946529d050c1d506352aa93527a0c9ffe22c65a4c875acaf8d8432f2b1615b5789f4898cccf540346aba90ff4c45df7a83378ed1a3291da0e6f588deb5194f3f3f338e6d79a19c37f29bcc320aa08e8a2b96a0639fd7074a77188863658dba6db12a1a89e3700a216402b420e68240ad81645c99f9c5e8161d71b58a89d62975b50a6e93b3b0c4718550f824c66901f0dcbbf801c1ca9ea83c60f16f79fc7bd0a07cdb55461a7178601c2aa5759dc3918213e999d7670d26076869ef134b258eeb4d33bd97269bfc49d04adaaa79a99dae3ad488238abd55c0a759f190c493cf61aa12b345d051377f6b</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好, 这里需要密码才能访问.</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">有东西被加密了, 请输入密码查看.</summary>
    
    
    
    <category term="OI" scheme="https://blog.satori-march.top/categories/OI/"/>
    
    <category term="游记" scheme="https://blog.satori-march.top/categories/travelogue/"/>
    
    
    <category term="OI" scheme="https://blog.satori-march.top/tags/OI/"/>
    
    <category term="encrypted" scheme="https://blog.satori-march.top/tags/encrypted/"/>
    
  </entry>
  
  <entry>
    <title>C#中的数据类型转换</title>
    <link href="https://blog.satori-march.top/posts/dotnet/c-sharp%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2/"/>
    <id>https://blog.satori-march.top/posts/dotnet/c-sharp%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2/</id>
    <published>2021-08-19T00:00:00.000Z</published>
    <updated>2023-12-19T17:21:25.000Z</updated>
    
    <content type="html"><![CDATA[<p>C# 是一门强类型语言，对类型的要求很严格，类型转换的方式有两种：<strong>隐式类型转换</strong>和<strong>显式类型转换</strong>。</p><h2 id="隐式类型转换">隐式类型转换</h2><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>;</span><br><span class="line"><span class="built_in">double</span> b = <span class="number">1.5</span>;</span><br><span class="line"><span class="built_in">double</span> c = a + b;</span><br><span class="line">System.Console.WriteLine(c);</span><br></pre></td></tr></table></figure><p>像这样，并没有在源代码里进行任何特殊处理，而是由编译器自动进行了从<code>int</code>类型到<code>double</code>类型的隐式转换。</p><p>但是很多类型之间不可以进行隐式类型转换，可以看下面的例子。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">1.5</span>;</span><br><span class="line">Console.WriteLine(a);</span><br></pre></td></tr></table></figure><p>在作者的电脑上编译时会有这样的报错：</p><blockquote><p>error CS0266: 无法将类型“double”隐式转换为“int”。存在一个显式转换(是否缺少强制转换?)</p></blockquote><p>因此，我们需要用显式类型转换改正它。</p><h2 id="显式类型转换">显式类型转换</h2><p>上面的例子的第一行应改为这样：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = (<span class="built_in">int</span>)<span class="number">1.5</span>;</span><br></pre></td></tr></table></figure><p>语法就是在要转换的变量前加一组小括号，里面写要转换成的类型名。所有的隐式类型转换都可以写成显式。</p><p>但是这样写输出的结果却是<code>1</code>而非四舍五入的<code>2</code></p><p>用显式类型转换<strong>会丢失数据的精度</strong>，这也是为什么不会自动进行显式类型转换。显式类型转换又叫强制类型转换。</p><p>而且显式类型转换也并非所有类型之间都能转的，例如下面这么写也是<strong>错误</strong>的：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">double</span> a = (<span class="built_in">double</span>)<span class="string">&quot;5.5&quot;</span>;</span><br></pre></td></tr></table></figure><div class="note warning flat"><p>在许多其他编程语言里，<code>int</code>可以隐式转换为<code>bool</code>，但是 C# 中无论是隐式还是显式都会报错，要使用后面提到的<code>Convert.ToBoolean()</code></p></div><p>为了解决上述的问题，我们将介绍使用方法进行类型转换。</p><h2 id="使用方法进行类型转换">使用方法进行类型转换</h2><h3 id="使用ToString-方法">使用<code>ToString()</code>方法</h3><p>所有的类型都可以使用<code>ToString()</code>方法（因为 <code>Object</code> 类定义了 <code>ToString</code> 方法，而所有类都直接或者间接派生自 <code>Object</code> 类），如下：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = <span class="number">5</span>;</span><br><span class="line"><span class="built_in">string</span> b = a.ToString();</span><br></pre></td></tr></table></figure><h3 id="使用Convert-ToInt32-方法">使用<code>Convert.ToInt32()</code>方法</h3><p><code>Convert</code>类提供了许多转换的方法，例如：<code>ToChar()</code>，<code>ToDouble()</code>，<code>ToBoolean()</code> 甚至 <code>ToDateTime()</code></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = Convert.ToInt32(<span class="string">&quot;55&quot;</span>);</span><br><span class="line"><span class="built_in">double</span> b = Convert.ToDouble(<span class="string">&quot;5.5&quot;</span>);</span><br><span class="line"><span class="built_in">string</span> s = Convert.ToString(<span class="number">123</span>);</span><br></pre></td></tr></table></figure><h3 id="使用Type-Parse-string-方法">使用<code>Type.Parse(string)</code>方法</h3><p><code>Parse()</code>方法用来将<strong>字符串</strong>转换为其他的<strong>数值</strong>类型</p><div class="note warning flat"><p><code>Parse()</code> 方法的参数只能是字符串<br>而 <code>Type</code> 只能是数字类型</p></div><p>使用时 <code>类型名.Parse(需要转换的变量);</code> 即可</p><p>例如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span> a = <span class="string">&quot;5&quot;</span>;</span><br><span class="line"><span class="built_in">int</span> b = <span class="built_in">int</span>.Parse(a);</span><br></pre></td></tr></table></figure><h3 id="注意事项">注意事项</h3><p>试图将字符串<code>&quot;5.5&quot;</code>转换成<code>int</code>类型时，下面两种方法都是<strong>错误</strong>的：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = Convert.ToInt32(<span class="string">&quot;5.5&quot;</span>);</span><br><span class="line"><span class="built_in">int</span> a = <span class="built_in">int</span>.Parse(<span class="string">&quot;5.5&quot;</span>);</span><br></pre></td></tr></table></figure><p>正确的做法应该是先把字符串 <code>&quot;5.5&quot;</code> 转换成 <code>double</code> 类型，再转换成 <code>int</code> 类型：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = (<span class="built_in">int</span>)Convert.ToDouble(<span class="string">&quot;5.5&quot;</span>);</span><br><span class="line"><span class="built_in">int</span> a = (<span class="built_in">int</span>)Double.Parse(<span class="string">&quot;5.5&quot;</span>);</span><br></pre></td></tr></table></figure><p>进行从字符串到数值类型转换时 <code>Convert</code> 和 <code>Parse</code> 做法一般可以互换, 区别在于对 <code>null</code> 的处理不同:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> a = Convert.ToInt32(<span class="literal">null</span>); <span class="comment">// a == 0</span></span><br><span class="line"><span class="built_in">int</span> b = <span class="built_in">int</span>.Parse(<span class="literal">null</span>); <span class="comment">// 异常</span></span><br></pre></td></tr></table></figure><p>另外, 传入空字符串 <code>&quot;&quot;</code> 时两者都会抛出异常</p><p>如果您希望自己封装的类可以被 <code>Convert</code> 类转换为基本类型, 请继承<code>IConvertible</code> 接口, 如果你觉得有些类型不应该被转化(点名<code>ToDateTime</code>), 请抛出 <code>InvalidCastException</code> 异常</p><h3 id="使用-int-TryParse-方法">使用 <code>int.TryParse()</code> 方法</h3><p>微软官方教程中的说明如下：</p><blockquote><p><code>TryParse()</code> 方法可同时执行多项操作：</p><ol><li><p>它会<strong>尝试</strong>将字符串分析成给定的数字数据类型。</p></li><li><p>如果成功，它会将转换后的值存储在 <strong>out 参数</strong>中。</p></li><li><p>它会<strong>返回布尔值</strong>来指示操作是否成功。</p></li></ol><p>对于<strong>所有数字数据类型</strong>，均可使用类似的 <code>TryParse()</code> 方法。</p></blockquote><p><s>其实多写一个try catch就解决了, 没什么用</s><br>例如：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">double</span> result;</span><br><span class="line"><span class="built_in">bool</span> a = <span class="built_in">double</span>.TryParse(<span class="string">&quot;5.5&quot;</span>, <span class="keyword">out</span> result); <span class="comment">// result 即为说明中第2条的 &quot;out参数&quot; </span></span><br><span class="line">Console.WriteLine(<span class="string">$&quot;a = <span class="subst">&#123;a&#125;</span>&quot;</span>);  <span class="comment">// c#6.0 以上才能用字符串内插</span></span><br><span class="line">Console.WriteLine(<span class="string">$&quot;result = <span class="subst">&#123;result&#125;</span>&quot;</span>);</span><br></pre></td></tr></table></figure><p>此时，输出结果应为：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">a = True</span><br><span class="line">result = <span class="number">5.5</span></span><br></pre></td></tr></table></figure><p><code>out</code> 关键字的用法类似 <code>ref</code> 关键字, 本质上都是传入引用, 且都需要在方法的定义和调用时显式使用该关键字</p><p>主要的区别为:</p><ol><li>使用 <code>ref</code> 必须在传参之前进行显式的初始化, 而 <code>out</code> 有没有都行</li><li>离开方法之前必须对有 <code>out</code> 关键字的参数赋值(否则通不过编译)</li><li>使用 <code>out</code> 的参数在方法中被视为未被初始化的</li><li>尽管你可以给传入赋值过的变量, 但在传入时参数的值是没有意义的</li></ol><p>另外, <code>out</code> 其实就是用 <code>ref</code> 来实现的, 所以不可以像 <code>Func(ref int a)</code> <code>Func(out int a)</code> 这样重载</p><h4 id="示例（来自微软官方文档-链接）">示例（来自微软官方文档 <a href="https://docs.microsoft.com/zh-cn/learn/modules/csharp-convert-cast/4-challenge">链接</a>）</h4><p>已知一个字符串数组 <code>values</code></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">string</span>[] values = &#123; <span class="string">&quot;12.3&quot;</span>, <span class="string">&quot;45&quot;</span>, <span class="string">&quot;ABC&quot;</span>, <span class="string">&quot;11&quot;</span>, <span class="string">&quot;DEF&quot;</span> &#125;;</span><br></pre></td></tr></table></figure><p>循环访问字符串数组中的每个值：如果值是字母，则连接它以形成消息；如果值是数字，则将其加到总计值</p><p>输出：</p><div class="note default flat"><p>Message: ABCDEF<br>Total: 68.3</p></div><p>示例代码:</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"></span><br><span class="line"><span class="built_in">string</span>[] values = &#123; <span class="string">&quot;12.3&quot;</span>, <span class="string">&quot;45&quot;</span>, <span class="string">&quot;ABC&quot;</span>, <span class="string">&quot;11&quot;</span>, <span class="string">&quot;DEF&quot;</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="built_in">double</span> total = <span class="number">0.0</span>;</span><br><span class="line"><span class="built_in">string</span> message = <span class="string">&quot;&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">foreach</span> (<span class="built_in">string</span> v <span class="keyword">in</span> values)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">decimal</span>.TryParse(v, <span class="keyword">out</span> <span class="built_in">double</span> temp)) total += temp;</span><br><span class="line">    <span class="keyword">else</span> message += v; </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Console.WriteLine(<span class="string">$&quot;Messagae: <span class="subst">&#123;message&#125;</span>&quot;</span>);</span><br><span class="line">Console.WriteLine(<span class="string">$&quot;Total: <span class="subst">&#123;total&#125;</span>&quot;</span>);</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;C# 是一门强类型语言，对类型的要求很严格，类型转换的方式有两种：&lt;strong&gt;隐式类型转换&lt;/strong&gt;和&lt;strong&gt;显式类型转换&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;隐式类型转换&quot;&gt;隐式类型转换&lt;/h2&gt;
&lt;figure class=&quot;highligh</summary>
      
    
    
    
    <category term="c#" scheme="https://blog.satori-march.top/categories/csharp/"/>
    
    
    <category term="c#" scheme="https://blog.satori-march.top/tags/csharp/"/>
    
  </entry>
  
</feed>
