Skip to content

Commit 16bc2e8

Browse files
committed
Site updated: 2020-06-16 15:18:57
1 parent d746dea commit 16bc2e8

File tree

2 files changed

+5
-5
lines changed

2 files changed

+5
-5
lines changed

2020/04/06/1049 Counting Ones (30分)/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
<link rel="dns-prefetch" href="http://yoursite.com">
99
<title>1049 Counting Ones (30分) | 鲍锋雄的博客</title>
1010
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
11-
<meta name="description" content="题目大意: 给一个数N,统计从1到N的所有数字中1出现的次数。 解题思路: 这道题是《编程之美》上面的一道题(第2.4节),需要通过分析来总结规律,然后总结出公式,如果暴力去“数”1的个数,显然会超时。但如果通过公式来算的话,时间复杂度就直接降到O(1)O(1)O(1)。具体分析过程比较复杂,详情参见《编程之美》2.4节“1的数目”,这里只给出结论——从右往左拆解数,逐位分析每个位出现1的数目,">
11+
<meta name="description" content="题目大意: 给一个数N,统计从1到N的所有数字中1出现的次数。 解题思路: 这道题是《编程之美》上面的一道题(第2.4节),需要通过分析来总结规律,然后总结出公式,如果暴力去“数”1的个数,显然会超时。但如果通过公式来算的话,时间复杂度就直接降到O(1)。具体分析过程比较复杂,详情参见《编程之美》2.4节“1的数目”,这里只给出结论——从右往左拆解数,逐位分析每个位出现1的数目,然后统计其规律与左">
1212
<meta property="og:type" content="article">
1313
<meta property="og:title" content="1049 Counting Ones (30分)">
1414
<meta property="og:url" content="http://yoursite.com/2020/04/06/1049%20Counting%20Ones%20(30%E5%88%86)/index.html">
1515
<meta property="og:site_name" content="鲍锋雄的博客">
16-
<meta property="og:description" content="题目大意: 给一个数N,统计从1到N的所有数字中1出现的次数。 解题思路: 这道题是《编程之美》上面的一道题(第2.4节),需要通过分析来总结规律,然后总结出公式,如果暴力去“数”1的个数,显然会超时。但如果通过公式来算的话,时间复杂度就直接降到O(1)O(1)O(1)。具体分析过程比较复杂,详情参见《编程之美》2.4节“1的数目”,这里只给出结论——从右往左拆解数,逐位分析每个位出现1的数目,">
16+
<meta property="og:description" content="题目大意: 给一个数N,统计从1到N的所有数字中1出现的次数。 解题思路: 这道题是《编程之美》上面的一道题(第2.4节),需要通过分析来总结规律,然后总结出公式,如果暴力去“数”1的个数,显然会超时。但如果通过公式来算的话,时间复杂度就直接降到O(1)。具体分析过程比较复杂,详情参见《编程之美》2.4节“1的数目”,这里只给出结论——从右往左拆解数,逐位分析每个位出现1的数目,然后统计其规律与左">
1717
<meta property="og:locale" content="en_US">
1818
<meta property="og:image" content="https://i.loli.net/2020/04/05/HVrRT4YhQvzeIkx.png">
1919
<meta property="article:published_time" content="2020-04-06T06:04:51.977Z">
20-
<meta property="article:modified_time" content="2020-04-06T06:05:41.490Z">
20+
<meta property="article:modified_time" content="2020-06-16T07:18:40.772Z">
2121
<meta property="article:author" content="bfx">
2222
<meta property="article:tag" content="PAT刷题记录">
2323
<meta name="twitter:card" content="summary">
@@ -184,7 +184,7 @@ <h1 class="article-title" itemprop="name">
184184
<div class="article-entry" itemprop="articleBody">
185185

186186
<p><strong>题目大意</strong>: 给一个数N,统计从1到N的所有数字中1出现的次数。</p>
187-
<p><strong>解题思路</strong>: 这道题是《编程之美》上面的一道题(第2.4节),需要通过分析来总结规律,然后总结出公式,如果暴力去“数”1的个数,显然会超时。但如果通过公式来算的话,时间复杂度就直接降到O(1)O(1)O(1)。具体分析过程比较复杂,详情参见《编程之美》2.4节“1的数目”,这里只给出结论——从右往左拆解数,逐位分析每个位出现1的数目,然后统计其规律与左右数存在的关系,最后累加,即为结果。</p>
187+
<p><strong>解题思路</strong>: 这道题是《编程之美》上面的一道题(第2.4节),需要通过分析来总结规律,然后总结出公式,如果暴力去“数”1的个数,显然会超时。但如果通过公式来算的话,时间复杂度就直接降到O(1)。具体分析过程比较复杂,详情参见《编程之美》2.4节“1的数目”,这里只给出结论——从右往左拆解数,逐位分析每个位出现1的数目,然后统计其规律与左右数存在的关系,最后累加,即为结果。</p>
188188
<p><img src="https://i.loli.net/2020/04/05/HVrRT4YhQvzeIkx.png" alt="20181220100453559.png"></p>
189189
<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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">找规律题,计算每一位对应的1的个数,然后相加,每一位的1的计算情况分三种情况:</span></span><br><span class="line"><span class="comment">1.如果当前位数字为0,那么该位的1的个数由更高位的数字确定。比如2120,个位为1的个数为212 * 1 = 212(个位的单位为1)。</span></span><br><span class="line"><span class="comment">2.如果当前位数字为1,那么该位的1的个数不但由高位决定,还由低位数字决定。比如2120百位为1,那么百位数字1的个数为2 * 100 + 20 + 1 = 221个(百位的单位为100)。</span></span><br><span class="line"><span class="comment">3.如果当前位数字大于1,那么该位数字1的个数为(高位数+ 1) * 位数单位。比如2120十位为2,那么十位数字1的个数为(21 + 1) * 10 = 220个(十位的单位为10)</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="keyword">int</span> N;</span><br><span class="line"> <span class="built_in">cin</span> &gt;&gt; N;</span><br><span class="line"> <span class="keyword">int</span> digit = <span class="number">1</span>, left, right, ans = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span> (N / digit) &#123;</span><br><span class="line"> <span class="keyword">int</span> now = N / digit % <span class="number">10</span>;</span><br><span class="line"> left = N / (digit * <span class="number">10</span>);</span><br><span class="line"> right = N % digit;</span><br><span class="line"> <span class="keyword">if</span> (now == <span class="number">0</span>)</span><br><span class="line"> ans += left * digit;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (now == <span class="number">1</span>)</span><br><span class="line"> ans += left * digit + right + <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> ans += (left + <span class="number">1</span>) * digit;</span><br><span class="line"> digit *= <span class="number">10</span>;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="built_in">cout</span> &lt;&lt; ans &lt;&lt; <span class="built_in">endl</span>;</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>
190190

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ <h1 itemprop="name">
198198
<div class="article-entry" itemprop="articleBody">
199199

200200
<p><strong>题目大意</strong>: 给一个数N,统计从1到N的所有数字中1出现的次数。</p>
201-
<p><strong>解题思路</strong>: 这道题是《编程之美》上面的一道题(第2.4节),需要通过分析来总结规律,然后总结出公式,如果暴力去“数”1的个数,显然会超时。但如果通过公式来算的话,时间复杂度就直接降到O(1)O(1)O(1)。具体分析过程比较复杂,详情参见《编程之美》2.4节“1的数目”,这里只给出结论——从右往左拆解数,逐位分析每个位出现1的数目,然后统计其规律与左右数存在的关系,最后累加,即为结果。</p>
201+
<p><strong>解题思路</strong>: 这道题是《编程之美》上面的一道题(第2.4节),需要通过分析来总结规律,然后总结出公式,如果暴力去“数”1的个数,显然会超时。但如果通过公式来算的话,时间复杂度就直接降到O(1)。具体分析过程比较复杂,详情参见《编程之美》2.4节“1的数目”,这里只给出结论——从右往左拆解数,逐位分析每个位出现1的数目,然后统计其规律与左右数存在的关系,最后累加,即为结果。</p>
202202
<p><img src="https://i.loli.net/2020/04/05/HVrRT4YhQvzeIkx.png" alt="20181220100453559.png"></p>
203203
<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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">找规律题,计算每一位对应的1的个数,然后相加,每一位的1的计算情况分三种情况:</span></span><br><span class="line"><span class="comment">1.如果当前位数字为0,那么该位的1的个数由更高位的数字确定。比如2120,个位为1的个数为212 * 1 = 212(个位的单位为1)。</span></span><br><span class="line"><span class="comment">2.如果当前位数字为1,那么该位的1的个数不但由高位决定,还由低位数字决定。比如2120百位为1,那么百位数字1的个数为2 * 100 + 20 + 1 = 221个(百位的单位为100)。</span></span><br><span class="line"><span class="comment">3.如果当前位数字大于1,那么该位数字1的个数为(高位数+ 1) * 位数单位。比如2120十位为2,那么十位数字1的个数为(21 + 1) * 10 = 220个(十位的单位为10)</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="keyword">int</span> N;</span><br><span class="line"> <span class="built_in">cin</span> &gt;&gt; N;</span><br><span class="line"> <span class="keyword">int</span> digit = <span class="number">1</span>, left, right, ans = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span> (N / digit) &#123;</span><br><span class="line"> <span class="keyword">int</span> now = N / digit % <span class="number">10</span>;</span><br><span class="line"> left = N / (digit * <span class="number">10</span>);</span><br><span class="line"> right = N % digit;</span><br><span class="line"> <span class="keyword">if</span> (now == <span class="number">0</span>)</span><br><span class="line"> ans += left * digit;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (now == <span class="number">1</span>)</span><br><span class="line"> ans += left * digit + right + <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> ans += (left + <span class="number">1</span>) * digit;</span><br><span class="line"> digit *= <span class="number">10</span>;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="built_in">cout</span> &lt;&lt; ans &lt;&lt; <span class="built_in">endl</span>;</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>
204204

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy