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

+4-4
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

+1-1
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)