﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-雁过无痕-随笔分类-算法</title><link>http://www.cppblog.com/flyinghearts/category/14110.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 21 Mar 2013 21:30:41 GMT</lastBuildDate><pubDate>Thu, 21 Mar 2013 21:30:41 GMT</pubDate><ttl>60</ttl><item><title>面试题: 找出数组中三个只出现一次的数</title><link>http://www.cppblog.com/flyinghearts/archive/2013/03/21/198695.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Thu, 21 Mar 2013 14:00:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2013/03/21/198695.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/198695.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2013/03/21/198695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/198695.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/198695.html</trackback:ping><description><![CDATA[<p style="text-align:center" align="center"><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;"><br /></span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;"></span></strong></p>    <p><strong><span>&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">题目：数组中有三个数只出现一次，其它的数恰好出现两次，找出这三个数。</span></strong></p>  <p>&nbsp;</p>  <p><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;;">先考虑&#8220;只有两个数出现一次&#8221;的情况：可以找到一种方法，将数组划分为两部分，且让这两个数分别在不同部分，这样每部分所有数的异或值，恰好分别等于这两个数。一种简单的分法就是，先计算出这两个数的异或值</span>M<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">（等价于求数组中所有数的异或值），求出</span>M<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">值的二进制表示中的最低位</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">（其它位的</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">也可以，只不过麻烦点）在</span> +k<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">位，然后根据</span> +k<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">位是否为</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，将原数组分为两部分。</span></p>  <p><span>&nbsp;&nbsp;&nbsp; </span></p>  <p><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;;">回到原题，假设这三个不同的数是：</span>A<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>B<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>C<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，它们的异或值</span> <strong><span>X = A xor B xor C</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，</span>X<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">值可能为</span>0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，也可能不为</span>0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。当</span>X<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">值不为</span>0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">时（比如：这三个数为</span>3<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>5<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>7<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，</span>X<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">值为</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">），很难找到一种方法，将原来的数组划分为两部分，使得这三个数不都在同一部分。因而，<strong>要先对原来的数组进行一次替换：将每个数与</strong></span><strong>X</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">进行异或</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。这样原来的三个数就变成了：</span></p>  <p>B xor C<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>A xor C<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>A xor B<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。记</span><strong>a = B xor C</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span></strong><strong>b = A xor C</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span></strong><strong><span>c = A xor B</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。新的异或值</span> x = <strong>a xor b xor c = 0</strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。</span></p>  <p>&nbsp;<span>&nbsp;&nbsp;</span></p>  <p><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;;">由于</span>A<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>B<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>C<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">互不相等，显然它们间的异或值</span><strong>a</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span></strong><strong>b</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span></strong><strong>c</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">都不为</span></strong><strong>0</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，且互不相等</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。（若</span>a<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">等于</span>b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，则</span><span> 0 = a xor b = (B xor C) xor (A xor C) = A xor B != 0</span><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;;">自相矛盾）</span></p>  <p><span>&nbsp;&nbsp; </span></p>  <p style="text-indent:21.1pt;"><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:#993300;">若三个数的异或值为</span></strong><strong><span style="color:#993300;">0</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;; color:#993300;">，且其中一个数在</span></strong><strong><span style="color:#993300;"> +n</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:#993300;">位（</span></strong><strong><span style="color:#993300;">n</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:#993300;">为任意值）上为</span></strong><strong><span style="color:#993300;">1</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;; color:#993300;">，则另两个数在</span></strong><strong><span style="color:#993300;"> +n</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:#993300;">位上必然一个为</span></strong><strong><span style="color:#993300;">1</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:#993300;">，另一个为</span></strong><strong><span style="color:#993300;">0</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">（不然的话，这三个数的异或值就不会为</span>0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">），<strong><span style="color:#993300">因而根据</span></strong></span><strong><span style="color:#993300;"> +n</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:#993300;">位为</span></strong><strong><span style="color:#993300;">1</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:#993300;">，可以将这三个数分成两部分</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。</span> </p>  <p style="text-indent:21.0pt;">&nbsp;</p>  <p style="text-indent:21.1pt;"><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">设</span></strong><strong>f(x)</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">为</span></strong><strong>x</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">的二进制表示中最低位</span></strong><strong>1</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">的位置，则</span></strong><strong>f(a)</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span></strong><strong>f(b)</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span></strong><strong>f(c)</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">这三个数中有且只有两个数相等</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。证明：不妨设</span>f(a)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>f(b)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>f(c)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">中最小的是</span>f(a)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，</span>k = f(a)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，则</span>b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">、</span>c<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">在</span> +k<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">位上必然是一个为</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，一个为</span>0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，不妨设</span>b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">在</span> +k<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">位为</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，则根据</span>f(x)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">的定义以及</span>f(a)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">最小，可得</span>f(b)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">等于</span>f(a)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，</span>f(c)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">大于</span>f(a)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。因而，新数组的数</span>x<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">对应的所有</span>f(x)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">的总异或值等于</span>f(c)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。</span></p>  <p style="text-indent:21.0pt;">&nbsp;</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">假设</span>f(a)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">等于</span>f(b)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，</span>m = f(c)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，由于</span>c<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">在</span> +m<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">位上为</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，不妨设</span> b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">在</span> +m<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">位也为</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，则</span>a<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">在</span> +m<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">位为</span>0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">。根据</span> +m<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">位是否为</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，可将新数组分为两部分，每部分的异或值恰好都是</span><span> <span>a = B xor C</span></span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">，可以求出数</span>A<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">（等于</span>a xor X<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">）。</span><span> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">将数</span>A<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">放入原来的数组，问题转为</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">&#8220;只有两个数出现一次&#8221;的情况，利用前面提到的方法算出另两个数。总共需遍历数组</span>4<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">次。</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">代码：</span> </p>  <p>&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#804000">#include &lt;cstdio&gt;</span></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#804000">#include &lt;cassert&gt;</span></p>  <p style="text-autospace:none">&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">static</span> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">inline</span> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> extract_rightmost_one</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">unsigned</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> value</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">)</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">{</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:blue">return</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> value </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">&amp;</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">-</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">value</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">}</span></strong></p>  <p style="text-autospace:none">&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:green">// if a != b,&nbsp;m = extract_rightmost_one(a), n = extract_rightmost_one(b),</span></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:green">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = extract_rightmost_one(a ^ b)</span></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:green">// then&nbsp;m == n != k&nbsp;&nbsp; or<span>&nbsp;&nbsp; </span>m == k != n&nbsp;&nbsp; or&nbsp;n == k != m</span></p>  <p style="text-autospace:none">&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">void</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> print_three_unique_number</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> arr</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">[],</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">unsigned</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> len</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">)</span></strong></p>  <p style="text-autospace:none"><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">{</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;assert </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">len </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">&gt;=</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#FF8000">3</span> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">&amp;&amp;</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> len </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">%</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#FF8000">2</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">);</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">*</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> beg </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> arr</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">*</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> end </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> arr </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">+</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> len</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none">&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> xor3 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong> <span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:#FF8000">0</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:blue">for</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">*</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> beg</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">!=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> end</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">++</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">p</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">)</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> xor3 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">^=</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">*</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">p</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none">&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> flag1 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong> <span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:#FF8000">0</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:blue">for</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">*</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> beg</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">!=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> end</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">++</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">p</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">)</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> flag1 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">^=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> extract_rightmost_one</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(*</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">^</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> xor3</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">);</span></strong></p>  <p style="text-autospace:none">&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;assert</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">flag1 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">!=</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#FF8000">0</span> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">&amp;&amp;</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">flag1 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">&amp;</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">flag1 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">-</span></strong> <span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:#FF8000">1u</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">))</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">==</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#FF8000">0u</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">);</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;; color:green">// flag1 == 2^^k</span></p>  <p style="text-autospace:none">&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> xor2 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong> <span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:#FF8000">0</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:blue">for</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">*</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> beg</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">!=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> end</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">++</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">p</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">)</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">{</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;&nbsp;&nbsp; </span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> value </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">*</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">^</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> xor3</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:blue">if</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">value </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">&amp;</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> flag1</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">)</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> xor2 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">^=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> value</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:green">//or:</span></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;&nbsp;&nbsp; </span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:green">// if ((value &amp; flag1) == 0) xor2 ^= value;</span></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">}</span></strong></p>  <p style="text-autospace:none">&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> number1 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> xor2 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">^</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> xor3</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> flag2 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> extract_rightmost_one</span><strong><span style="font-size:9.0pt;font-family: &#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size: 9.0pt;font-family:&#203;&#206;&#204;&#229;; color:black">xor2</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">);</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> number2 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">number1 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">&amp;</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> flag2</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">)</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">?</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> number1 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">:</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#FF8000">0</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:green">// </span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:green;">put</span><span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:green"> number1 </span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:green;">in</span><span style="font-size: 9.0pt;font-family:&#203;&#206;&#204;&#229;; color:green">to the array</span></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:blue">for</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt; font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">*</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> beg</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">!=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> end</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">++</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">p</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">)</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">{</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:blue">if</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(*</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">p </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">&amp;</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> flag2</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">)</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> number2 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">^=</span></strong> <strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">*</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">p</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">}</span></strong></p>  <p style="text-autospace:none">&nbsp;</p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">const</span> <span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:#8000FF">int</span><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> number3 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">=</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> xor2 </span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">^</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> number2</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">;</span></strong></p>  <p style="text-autospace:none"><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black">&nbsp;printf</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">(</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:gray">"%d %d %d\n"</span><strong><span style="font-size:9.0pt;font-family: &#203;&#206;&#204;&#229;;color:navy">,</span></strong><span style="font-size: 9.0pt;font-family:&#203;&#206;&#204;&#229;; color:black"> number1</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">,</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> number2</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">,</span></strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:black"> number3</span><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">);</span></strong></p>  <p style="text-autospace:none"><strong><span style="font-size:9.0pt;font-family:&#203;&#206;&#204;&#229;;color:navy">}</span></strong></p>  <p style="text-autospace:none"><strong>&nbsp;</strong></p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">上面的代码并不严格符合</span>C++<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">标准，而是假定机器采用补码表示负数（不采用补码表示的老古董，一般人也碰不到）。</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">另外要特别注意的是，一些计算最好先转为无符号数，避免溢出，最后再转回有符号数。因为标准假定有符号数间的计算不发生溢出，当实际上发生溢出时，就是</span>UB<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;">行为，编译器若进行些激进的优化就得不到正确结果。</span></p>  <p style="text-indent:21.0pt;">&nbsp;</p><img src ="http://www.cppblog.com/flyinghearts/aggbug/198695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2013-03-21 22:00 <a href="http://www.cppblog.com/flyinghearts/archive/2013/03/21/198695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>避免计算过程中出现溢出的一个技巧</title><link>http://www.cppblog.com/flyinghearts/archive/2012/03/18/168267.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 18 Mar 2012 13:16:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/03/18/168267.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/168267.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/03/18/168267.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/168267.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/168267.html</trackback:ping><description><![CDATA[<div>    <p>&nbsp;</p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">先看一道面试题：</span></p><p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><br /></span></p>    <p style="text-indent:23.6pt;"><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">长度为</span></strong><strong><span style="font-size:12.0pt">n</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">的数组，由数字</span></strong><strong><span style="font-size:12.0pt">1</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">到</span></strong><strong><span style="font-size:12.0pt">n</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">组成，其中数字</span></strong><strong><span style="font-size:12.0pt">a</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">不出现，数字</span></strong><strong><span style="font-size:12.0pt">b</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">出现两次，其它的数字恰好出现一次。怎样通过只读遍历一次数组，找出数字</span></strong><strong><span style="font-size:12.0pt">a</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">和</span></strong><strong><span style="font-size:12.0pt">b</span></strong><strong><span style="font-size:12.0pt;font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">。</span></strong></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">由于只能遍历一次，在遍历数组</span>arr<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">时，算出</span> a<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的差值，以及</span>a<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>b<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">的平方差，通过解方程，即可求得</span>a<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。具体做法为：</span></p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">设：</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>s1 = 1 + 2 + ... + n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(= n * (n + 1) / 2)</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>s2 = arr[0] + arr[1] + ... + arr[n - 1]</span></p>  <p><span>&nbsp;&nbsp;&nbsp; </span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>r1 = 1 + 4 + ... + n^2&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(= n * (n + 1) * (2 * n + 1) / 6)</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>r2 = arr[0]^2 + arr[1]^2 + ... + arr[n - 1]^2</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>  <p><span>&nbsp;&nbsp; &nbsp;&nbsp;c = a - b = s1 - s2</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp; d = a^2 - b^2 = r1 - r2</span></p>  <p>&nbsp;<span>&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">显然：</span> <span>&nbsp;a + b = (r1 - r2) / (s1 - s2) </span></p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">根据</span>a+b<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">的值和</span>a-b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的值，很容易就可算出</span>a<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>b<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">。</span></p>  <p>&nbsp;</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">算法虽然简单，但实现起来，却有一个很大问题：计算</span> s1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>s2<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>r1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>r2<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">这</span>4<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">个数时，计算过程中可能出现溢出，造成结果不准。由于最终目的是为了计算出</span>c<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>d<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，一个改进的方法是：</span></p>  <p><span>&nbsp;c = s1 - s2 = (1 - arr[0]) + (2 - arr[1]) + ... + (n - arr[n - 1])</span></p>  <p><span>&nbsp;d = (1 - arr[0]^2) + (4 - arr[1]^2) + ... + (n^2 - arr[n - 1]^2)</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">但这样的做法，并不能解决问题，</span>n<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">稍微大点，照样存在溢出问题。</span></p>  <p>&nbsp;</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">那么怎样才能避免计算溢出呢？答案很简单，<strong><span style="color:red">用模运算！</span></strong>每进行一次加减运算时，都取结果为原结果除以一个足够大的常数</span>M<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的余数。这样加减运算中，就不会现现溢出问题。最后再由</span> c % M<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>d % M<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，推测出</span>c<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>d<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的具体值。比如说，计算</span>s2<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">改为计算：</span></p>  <p>&nbsp;<span>&nbsp;&nbsp;s2 % M = ((((arr[0] % M) + arr[1]) % M + ...) % M + arr[n - 1]) %M</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">从表面上看，采用模运算后，计算量会增加很多。但实际上，若</span>M<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">取合适的值时，计算量并不会增加！！</span></p>  <p>&nbsp;</p>  <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">先回顾下计算机基本知识：两个各</span>N<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">位（寄存器为</span>N<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">位）的二进制无符号整数</span>a<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>b<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">相加，若结果溢出了，</span>CPU<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">会怎么处理？当然是将溢出的那一位忽略掉（可能还要设置下溢出标志），得到的结果实际上是：</span>(a + b) mod 2^N<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。<strong><span style="color:red">无符号数间的算术运算，本质上就是模运算</span></strong>。现在的</span>CPU<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">都<strong><span style="color:red">采用二补数来表示负整数，本质上也是运用模运算</span></strong>（教科书将二补数表示的负整数简单定义为：对正整数取反后加</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">），这与无符号数间的运算是一致的，在实现上，比用其它方法（比如说一补数）表示负整数，要优美易实现。</span></p>  <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在</span>32<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">位平台下，</span> <span>-x mod 2^32 = 2^32 &#8211; x&nbsp;(x &gt; 0)</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，</span> </p>  <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">因而</span>-1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的二进制表示就是：</span>0xFFFFFFFF</p>  <p>&nbsp;</p>  <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">了解了这些，就不会奇怪</span>C/C++<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">标准的规定：无符号数间的运算是模运算不会溢出；有符号数转为无符数，采用模运算后的值。（为了兼容没采用二补数的机器，无符号数转为有符号数时，若无符号数的数值超出了有符号数可表示的范围，结果是平台相关的。）</span></p>  <p>&nbsp;</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">因而，在对</span>32<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">位</span>CPU<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">平台，可以先将有符号数转为无符号数，再取</span>M = 2 ^32<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。需要特别注意的是，应该采用多少位的无符号数保存计算中用到的数值，如何避免模运算可能带来的问题：</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">&#9312;　无符号数类型的选择：</span></p>  <p style="margin-left:27.0pt; text-indent:-6.0pt;">a<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>b<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">的取值范围为：</span>[1, n]<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，</span> </p>  <p style="text-indent:21.0pt;">c % M = (a - b) % M <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的取值范围为：</span>[1, n] (a &gt; b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">时</span>)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，</span><span>&nbsp;&nbsp; [M - n, M - 1] (a &lt; b</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">时</span>)</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">这两个范围不能重叠，而因</span> n &lt; M - n <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">即</span> 2 * n &lt; M</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">若</span> M<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">取</span>2^32<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的话，且</span><span> n &lt; 2^31</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，</span> <span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">可以采用</span>32<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">位无符号数表示</span>c<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的值。</span></p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">根据</span>c % M<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">值在哪一个范围，可以确定</span>a &gt; b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">还是</span>a &lt; b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，</span></p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">由于运算过程中都是采用无符号数计算，当</span> a &lt; b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">时，必须进行如下调整：</span></p>  <p><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c % M </span><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">调整为</span>&nbsp;(-c) % M</p>  <p><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d % M </span><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">调整为</span>&nbsp;(-d) % M</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">这样才能保证结果的正确性。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">&#9313;</span> <span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">用公式计算所有数字的和、平方和时，可能出现的问题：</span></p>  <p><span>&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">模运算满足：</span><span>&nbsp;(a <strong>*</strong> b) % M &nbsp;=&nbsp;((a % M) <strong>*</strong> (b % M)) % M</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">但<strong>不满足</strong>：</span><span>&nbsp;(a<strong> /</strong> b) % M &nbsp;=&nbsp;((a % M) <strong>/</strong> (b % M)) % M</span></p>  <p><span>&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在计算</span>&nbsp;(n * (n + 1) / 2) % M<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">时，</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">不能写成：</span></p>  <p>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp; s = ((n * (n + 1)) % M / 2) % M</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，</span></p>  <p><span>&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">而应该写成：</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp; if &nbsp;(n % 2 == 0)&nbsp;&nbsp; s = ((n / 2) * (n + 1)) % M</span></p>  <p>&nbsp;<span>&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;s = (((n + 1) / 2) * n) % M</span></p>  <p><span>&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">或者：</span><span>s = (INT((n + 1) / 2) * (n + (n + 1) % 2)) % M </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（其中</span>INT(x)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">为取小数</span>x<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">的整数部份）。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">完整代码：</span></p>  <p style="text-align: left;" align="left">&nbsp;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">climits</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">cassert</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;SMALL_ARRAY&nbsp;0</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Pair&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;zero;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;twice;<br />};<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">32位CPU平台，长度n一定小于2^16次方时，表示一个数的平方值，可用32位无符号数类型，效率很高。<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">长度n若在[2^16,&nbsp;2^31]区间，就必须用到64位无符号数类型，效率较高。<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">长度n若在[2^31,&nbsp;2^32)时，表示&nbsp;所有数的和sum，就必须改用64位无符号数类型，效率不高。&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">Pair&nbsp;find_number(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;arr[],&nbsp;unsigned&nbsp;len)<br />{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;bits&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CHAR_BIT&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(unsigned);<br /></span><span style="color: #0000FF; ">#if</span><span style="color: #000000; ">&nbsp;SMALL_ARRAY</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;max_len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1u</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;(bits&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2u</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;typedef&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;max_len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1u</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;(bits&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;typedef&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;assert(arr&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;max_len);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;data&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)arr;<br />&nbsp;&nbsp;unsigned&nbsp;sum&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">&nbsp;square_sum&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(unsigned&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;len;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;data[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;square_sum&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">)value&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;value;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">注意两个数的乘积是否会溢出&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">1&nbsp;+&nbsp;2&nbsp;+&nbsp;3&nbsp;+&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;+&nbsp;len&nbsp;=&nbsp;len&nbsp;*&nbsp;(len&nbsp;+&nbsp;1)&nbsp;/&nbsp;2</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">&nbsp;sum_all&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(len&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2u</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">)(len&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(len&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2u</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">1^2&nbsp;+&nbsp;2^2&nbsp;+&nbsp;3^2&nbsp;+&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;+&nbsp;len^2&nbsp;=&nbsp;len&nbsp;*&nbsp;(len&nbsp;+&nbsp;1)&nbsp;*&nbsp;(2&nbsp;*&nbsp;len&nbsp;+&nbsp;1)&nbsp;/&nbsp;6</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;len2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2u</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">&nbsp;square_sum_all&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len2&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3u</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;len2&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3u</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;sum_all&nbsp;:&nbsp;sum_all&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3u</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;len2;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;unsigned&nbsp;difference&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(unsigned)sum_all&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;sum;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">uint</span><span style="color: #000000; ">&nbsp;square_difference&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;square_sum_all&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;square_sum;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;is_negative&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;difference&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;INT_MAX;<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(is_negative)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;difference&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">difference;<br />&nbsp;&nbsp;&nbsp;&nbsp;square_difference&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">square_difference;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;assert(difference&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;square_difference&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;difference&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;sum_two&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;square_difference&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;difference;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;assert((sum_two&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;difference)&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2u</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;larger&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(sum_two&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;difference)&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2u</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;smaller&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(sum_two&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;difference)&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2u</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(is_negative)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Pair&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{&nbsp;smaller,&nbsp;larger};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;result;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Pair&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{&nbsp;larger,&nbsp;smaller};<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;result;<br />}<br /><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br /><br />}<br /><br /><br /></span></div></div><img src ="http://www.cppblog.com/flyinghearts/aggbug/168267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2012-03-18 21:16 <a href="http://www.cppblog.com/flyinghearts/archive/2012/03/18/168267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Fibonacci数计算中的两个思维盲点及其扩展数列的通用高效解法</title><link>http://www.cppblog.com/flyinghearts/archive/2012/02/28/166717.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 28 Feb 2012 14:14:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/02/28/166717.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/166717.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/02/28/166717.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/166717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/166717.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.cppblog.com/flyingheartshttp://www.cnblogs.com/flyingheartshttp://blog.csdn.net/flyingheartspdf版本下载㈠　Fibonacci数 刚接触Fibonacci数的时候，在网上看到&#8220;矩阵法&#8221;，看到要先实现一个矩阵乘法，感觉太麻烦了。后来仔细观察Fibonacci数列...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2012/02/28/166717.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/166717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2012-02-28 22:14 <a href="http://www.cppblog.com/flyinghearts/archive/2012/02/28/166717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>喝汽水问题</title><link>http://www.cppblog.com/flyinghearts/archive/2011/09/23/156635.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Fri, 23 Sep 2011 11:45:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/09/23/156635.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/156635.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/09/23/156635.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/156635.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/156635.html</trackback:ping><description><![CDATA[<div>  <p style="text-align: center; text-indent: 23.6pt;" align="center"><strong><span style="font-size: 12pt; font-family: 宋体;">喝汽水问题</span></strong></p>  <p style="text-align: center; text-indent: 23.6pt;" align="center"><strong><span style="font-size: 12pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt;">by flyinghearts</span></p>  <p style="text-indent: 23.6pt;"><strong>&nbsp;</strong></p>  <p style="text-indent: 23.6pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">有</span></strong><strong><span style="font-size: 12pt;">1000</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">瓶汽水，喝完后每</span></strong><strong><span style="font-size: 12pt;">3</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">个空瓶能换</span></strong><strong><span style="font-size: 12pt;">1</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">瓶汽水，问最后最多可以喝几瓶汽水，此时剩余几个空瓶？</span></strong></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p style="text-indent: 20.65pt;"><strong><span style="font-family: 宋体;">不妨假设，共有</span>n</strong><strong><span style="font-family: 宋体;">瓶汽水，每</span>a</strong><strong><span style="font-family: 宋体;">个空瓶能换</span>b</strong><strong><span style="font-family: 宋体;">瓶汽水（</span>a &gt; b</strong><strong><span style="font-family: 宋体;">）。</span></strong><span style="font-family: 宋体;">刚开始有</span>n<span style="font-family: 宋体;">瓶汽水，喝完后就有</span>n<span style="font-family: 宋体;">个空瓶，多喝的汽水是靠空瓶换来的，<strong><span style="color: blue;">每进行一次空瓶换汽水，就能多喝</span></strong></span><strong><span style="color: blue;">b</span></strong><strong><span style="font-family: 宋体; color: blue;">瓶汽水、空瓶数目就减少了</span><span style="color: blue;">a-b</span></strong><strong><span style="font-family: 宋体; color: blue;">个</span></strong><span style="font-family: 宋体;">（</span>a<span style="font-family: 宋体;">个空瓶换了</span>b<span style="font-family: 宋体;">瓶汽水，喝完后得到</span>b<span style="font-family: 宋体;">个空瓶）。</span></p>  <p>&nbsp;</p>  <p style="text-indent: 10.5pt;">(<span style="font-family: 宋体;">下面<strong>用</strong></span><strong> [x] </strong><strong><span style="font-family: 宋体;">表示</span>x</strong><strong><span style="font-family: 宋体;">的整数部分</span></strong>)</p>  <p><strong><span style="color: #993300;">1 </span></strong><strong><span style="font-family: 宋体; color: #993300;">如果允许从别处（老板或其他顾客处）借空瓶（当然，有借有还）</span></strong></p>  <p style="text-indent: 10.55pt;"><strong><span style="font-family: 宋体; color: blue;">空瓶换汽水次数：</span><span style="color: blue;">&nbsp;&nbsp; [n / (a - b)]</span></strong></p>  <p style="text-indent: 10.55pt;"><strong><span style="font-family: 宋体; color: blue;">最后剩余空瓶：</span><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp; n % (a - b)</span></strong></p>  <p style="text-indent: 10.55pt;"><strong><span style="font-family: 宋体; color: blue;">总共可以喝到汽水：</span><span style="color: blue;"> n + [n / (a - b)] * b</span></strong></p>  <p>&nbsp;</p>  <p><strong><span style="color: #993300;">2 </span></strong><strong><span style="font-family: 宋体; color: #993300;">不允许借空瓶</span></strong></p>  <p>&nbsp;<span style="font-family: 宋体;">空瓶换汽水过程中，<strong><span style="color: blue;">一但空瓶数小于</span></strong></span><strong><span style="color: blue;">a</span></strong><strong><span style="font-family: 宋体; color: blue;">，则停止交换。</span></strong></p>  <p>&nbsp;<span style="font-family: 宋体;">对</span> n &lt; a<span style="font-family: 宋体;">，显然，空瓶换汽水次数为</span>0<span style="font-family: 宋体;">，总共可以喝到汽水</span>n<span style="font-family: 宋体;">瓶，最后剩余空瓶</span>n<span style="font-family: 宋体;">个</span></p>  <p>&nbsp;<span style="font-family: 宋体;">对</span> n &gt;= a<span style="font-family: 宋体;">：（下面提供三种解法）</span></p>  <p>&nbsp;&nbsp;<span style="font-family: 宋体;">解法一</span><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">空瓶换汽水次数</span>k<span style="font-family: 宋体;">等于满足</span>n &#8211; (a-b)*t &lt; a<span style="font-family: 宋体;">的最小非负整数</span>t:</p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t &gt; (n-a)/(a-b)</span><span style="font-family: 宋体;">，最小的</span>t<span style="font-family: 宋体;">为</span> [(n-a)/(a-b)] + 1 = [(n-b)/(a-b)]</p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;</span><span style="font-family: 宋体;">剩余的空瓶数：</span>n &#8211; (a-b)*t </p>  <p style="text-indent: 5cm;">= n &#8211; (a-b)*([(n-b)/(a-b)]) </p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= b + (n-b) - (a-b)*([(n-b)/(a-b)])</span></p>  <p style="text-indent: 5cm;">= b + (n-b)%(a-b)</p>  <p style="text-indent: 136.5pt;">&nbsp;</p>  <p style="margin-left: 68.25pt; text-indent: -52.5pt;"><span style="font-family: 宋体;">解法二</span>&nbsp;<span>&nbsp;&nbsp;</span><span style="font-family: 宋体;">先预留</span>a<span style="font-family: 宋体;">个空瓶，将剩余的</span>n-a<span style="font-family: 宋体;">个空瓶进行换汽水，换的过程中，若空瓶不够</span>a<span style="font-family: 宋体;">个，则从预留的</span>a<span style="font-family: 宋体;">个空瓶中&#8220;借&#8221;，因而，</span></p>  <p style="margin-left: 57.75pt; text-indent: 10.5pt;"><span style="font-family: 宋体;">空瓶换汽水次数：</span>[(n-a)/(a-b)] + 1 = [(n-b)/(a-b)]<span style="font-family: 宋体;">（预留的</span>a<span style="font-family: 宋体;">个空瓶也能换一次）</span></p>  <p style="text-indent: 68.25pt;"><span style="font-family: 宋体;">最后剩余空瓶：</span> (n-b) % (a-b) + b<span style="font-family: 宋体;">（预留的</span>a<span style="font-family: 宋体;">个空瓶换得</span>b<span style="font-family: 宋体;">瓶汽水）</span></p>  <p style="text-indent: 78.75pt;">&nbsp;</p>  <p style="margin-left: 63pt; text-indent: -47.25pt;"><span style="font-family: 宋体;">解法三</span><span>&nbsp;&nbsp; </span><span style="font-family: 宋体;">最后一次空瓶换汽水得到的</span>b<span style="font-family: 宋体;">瓶汽水，喝完后得到</span>b<span style="font-family: 宋体;">个空瓶，因而最后剩余空瓶数必然大于</span>b<span style="font-family: 宋体;">个，先预留</span>b<span style="font-family: 宋体;">个空瓶，将剩余的</span>n-b<span style="font-family: 宋体;">个空瓶进行换汽水，若空瓶不够</span>a<span style="font-family: 宋体;">个，则从预留的</span>b<span style="font-family: 宋体;">个空瓶中&#8220;借&#8221;（由于能进行空瓶换汽水，空瓶数</span>&gt;= a &#8211; b<span style="font-family: 宋体;">，因而&#8220;借&#8221;完后，可以保证空瓶数大等于</span>a<span style="font-family: 宋体;">），</span></p>  <p style="text-indent: 10.5pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体;">空瓶换汽水次数：</span>[(n-b)/(a-b)]<span style="font-family: 宋体;">，</span> </p>  <p style="text-indent: 68.25pt;"><span style="font-family: 宋体;">最终剩余空瓶数：</span>b + (n-b) % (a-b)</p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">（对解法三，</span>n&gt;=b<span style="font-family: 宋体;">时结论成立，对解法一、二，可以验证</span>n &gt;=b<span style="font-family: 宋体;">时，结论也成立）</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">因而，<strong><span style="color: blue;">对</span></strong></span><strong><span style="color: blue;"> n &gt;= b </span></strong></p>  <p style="text-indent: 10.55pt;"><strong><span style="font-family: 宋体; color: blue;">空瓶换汽水次数：</span><span style="color: blue;">&nbsp;&nbsp; [(n-b)/(a-b)] </span></strong></p>  <p style="text-indent: 10.55pt;"><strong><span style="font-family: 宋体; color: blue;">最后剩余空瓶：</span><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp; b + (n-b) % (a-b)</span></strong></p>  <p style="text-indent: 10.55pt;"><strong><span style="font-family: 宋体; color: blue;">总共可以喝到汽水：</span><span style="color: blue;"> n + [(n-b)/(a-b)] * b</span></strong></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">对原题：</span></p>  <p><span>&nbsp;n = 1000</span><span style="font-family: 宋体;">，</span>a = 3, b = 1<span style="font-family: 宋体;">，</span> a &#8211; b = 2</p>  <p>&nbsp;<strong><span style="font-family: 宋体;">若允许借空瓶</span> <span>&nbsp;&nbsp;&nbsp;</span></strong></p>  <p style="text-indent: 25.7pt;"><span style="font-family: 宋体;">可以喝到汽水：</span> 1000 + 1000 / 2 = 1500</p>  <p style="text-indent: 25.7pt;"><span style="font-family: 宋体;">剩余空瓶：</span>1000 % 2 = 0</p>  <p style="text-indent: 25.7pt;">&nbsp;</p>  <p style="text-indent: 10.35pt;"><strong><span style="font-family: 宋体;">若不允许借空瓶</span> </strong></p>  <p style="text-indent: 25.7pt;"><span style="font-family: 宋体;">可以喝到汽水：</span> 1000 + (1000 - 1) / 2 = 1499<span style="font-family: 宋体;">，</span> </p>  <p style="text-indent: 25.7pt;"><span style="font-family: 宋体;">剩余空瓶：</span><span>&nbsp;&nbsp;&nbsp;&nbsp; 1 + (1000 - 1) % 2 = 2</span></p>  <p>&nbsp;</p>  </div><img src ="http://www.cppblog.com/flyinghearts/aggbug/156635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-09-23 19:45 <a href="http://www.cppblog.com/flyinghearts/archive/2011/09/23/156635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对环状数组求连续子数组的最大和</title><link>http://www.cppblog.com/flyinghearts/archive/2011/07/20/151513.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Wed, 20 Jul 2011 15:49:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/07/20/151513.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/151513.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/07/20/151513.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/151513.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/151513.html</trackback:ping><description><![CDATA[<br /><div>  <p align="left">&nbsp;<div>思路：由于数组元素总和是固定值，因而跨头、尾的连续子数组和最大，等价于求 中间那段和最小。因此，问题转为计算 连续子数组的最大和 与 连续子数组的最小和 </div></p><p align="left"><br /></p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">import</span></strong><span style="font-family: 宋体; color: black;"> std</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">algorithm</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">int</span></strong><span style="font-family: 宋体; color: black;"> ring_max_continue_sum</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><strong><span style="font-family: 宋体; color: blue;">in</span></strong> <strong><span style="font-family: 宋体; color: blue;">int</span></strong><strong><span style="font-family: 宋体; color: navy;">[]</span></strong><span style="font-family: 宋体; color: black;"> src</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">int</span></strong><span style="font-family: 宋体; color: black;"> min_sum </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> src</span><strong><span style="font-family: 宋体; color: navy;">[</span></strong><span style="font-family: 宋体; color: #ff8000;">0</span><strong><span style="font-family: 宋体; color: navy;">],</span></strong><span style="font-family: 宋体; color: black;"> cur_min_sum </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> min_sum</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">int</span></strong><span style="font-family: 宋体; color: black;"> max_sum </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> src</span><strong><span style="font-family: 宋体; color: navy;">[</span></strong><span style="font-family: 宋体; color: #ff8000;">0</span><strong><span style="font-family: 宋体; color: navy;">],</span></strong><span style="font-family: 宋体; color: black;"> cur_max_sum </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> max_sum</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">int</span></strong><span style="font-family: 宋体; color: black;"> total_sum </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> src</span><strong><span style="font-family: 宋体; color: navy;">[</span></strong><span style="font-family: 宋体; color: #ff8000;">0</span><strong><span style="font-family: 宋体; color: navy;">];</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">foreach</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">value</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;"> src</span><strong><span style="font-family: 宋体; color: navy;">[</span></strong><span style="font-family: 宋体; color: #ff8000;">1</span> <strong><span style="font-family: 宋体; color: navy;">..</span></strong><span style="font-family: 宋体; color: black;"> $</span><strong><span style="font-family: 宋体; color: navy;">])</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>cur_min_sum </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> min</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">value</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> cur_min_sum </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> value</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>min_sum </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> min</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">min_sum</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> cur_min_sum</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp; </span></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>cur_max_sum </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> max</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">value</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> cur_max_sum </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> value</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>max_sum </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> max</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">max_sum</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> cur_max_sum</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp; </span></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>total_sum </span><strong><span style="font-family: 宋体; color: navy;">+=</span></strong><span style="font-family: 宋体; color: black;"> value</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> max</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">max_sum</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> total_sum </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> min_sum</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">unittest</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">auto</span></strong><span style="font-family: 宋体; color: black;"> ta </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <strong><span style="font-family: 宋体; color: navy;">[</span></strong><span style="font-family: 宋体; color: #ff8000;">3</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: #ff8000;">2</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #ff8000;">3</span><strong><span style="font-family: 宋体; color: navy;">];</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">auto</span></strong><span style="font-family: 宋体; color: black;"> tb </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <strong><span style="font-family: 宋体; color: navy;">[</span></strong><span style="font-family: 宋体; color: #ff8000;">3</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #ff8000;">4</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: #ff8000;">2</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #ff8000;">3</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: #ff8000;">7</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: #ff8000;">3</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #ff8000;">8</span><strong><span style="font-family: 宋体; color: navy;">];</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">assert</span></strong><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ta</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">ring_max_continue_sum </span><strong><span style="font-family: 宋体; color: navy;">==</span></strong> <span style="font-family: 宋体; color: #ff8000;">6</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">assert</span></strong><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">tb</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">ring_max_continue_sum </span><strong><span style="font-family: 宋体; color: navy;">==</span></strong> <span style="font-family: 宋体; color: #ff8000;">16</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> </p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">void</span></strong><span style="font-family: 宋体; color: black;"> main</span><strong><span style="font-family: 宋体; color: navy;">()</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p>&nbsp;</p>  </div><img src ="http://www.cppblog.com/flyinghearts/aggbug/151513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-07-20 23:49 <a href="http://www.cppblog.com/flyinghearts/archive/2011/07/20/151513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最短摘要的生成（补充）</title><link>http://www.cppblog.com/flyinghearts/archive/2011/07/20/151511.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Wed, 20 Jul 2011 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/07/20/151511.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/151511.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/07/20/151511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/151511.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/151511.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 把另一种解法也贴出来吧（由于题目的背景是在大量数据中查找少数关键字，效率不如前面的解法）。基本思路：将 关键字 从1开始编号， 对分词后源词组，进行映射，如果是关键字，就映射为该关键字的编号，否则映射为数字0用两个指针，一前一后，很容易就可以实现在O(n)时间内找出结果。Code highlighting produced by Actipro CodeHighlighter (freeware)...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2011/07/20/151511.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/151511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-07-20 23:39 <a href="http://www.cppblog.com/flyinghearts/archive/2011/07/20/151511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fibonacci数列的两种O(lgn)解法</title><link>http://www.cppblog.com/flyinghearts/archive/2011/07/20/151510.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Wed, 20 Jul 2011 15:30:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/07/20/151510.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/151510.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/07/20/151510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/151510.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/151510.html</trackback:ping><description><![CDATA[<p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">import</span></strong><span style="font-family: 宋体; color: black;"> std</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">stdio </span><strong><span style="font-family: 宋体; color: navy;">:</span></strong><span style="font-family: 宋体; color: black;"> writef</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> fib_matrix</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> num</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong><span style="font-family: 宋体; color: black;">&nbsp;</span><span style="font-family: 宋体; color: green;">// </span><span style="font-family: 宋体; color: green;">矩阵法求fibonacci数</span></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">if</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">num </span><strong><span style="font-family: 宋体; color: navy;">&lt;=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> num</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: navy;">--</span></strong><span style="font-family: 宋体; color: black;">num</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> ret </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> next </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">for</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> a </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> b </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8000;">0</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;"> num </span><strong><span style="font-family: 宋体; color: navy;">!=</span></strong> <span style="font-family: 宋体; color: #ff8000;">0</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;"> num </span><strong><span style="font-family: 宋体; color: navy;">&gt;&gt;=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: blue;">if</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">num </span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><strong><span style="font-family: 宋体; color: blue;">auto</span></strong><span style="font-family: 宋体; color: black;"> tmp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> next</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;next </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">a </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> b</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> next </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> a </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> ret</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;ret </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> a </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> tmp </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> b </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> ret</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: blue;">auto</span></strong><span style="font-family: 宋体; color: black;"> tmp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> a </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">a </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong> <span style="font-family: 宋体; color: #ff8000;">2</span> <strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> b</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> b </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> b </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> tmp </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> tmp</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> ret</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> fib</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> num</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">if</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">num </span><strong><span style="font-family: 宋体; color: navy;">&lt;=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> num</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> left_most_one </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> num</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong> <span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">小等于num的最大2的k次幂</span></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">for</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> value </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> num</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;"> value </span><strong><span style="font-family: 宋体; color: navy;">&amp;=</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">value </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> <strong><span style="font-family: 宋体; color: navy;">)</span></strong><span style="font-family: 宋体; color: black;"> left_most_one </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> value</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> ret </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> next </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">while</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">left_most_one </span><strong><span style="font-family: 宋体; color: navy;">&gt;&gt;=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: blue;">if</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">num </span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> left_most_one</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><strong><span style="font-family: 宋体; color: blue;">auto</span></strong><span style="font-family: 宋体; color: black;"> tmp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ret</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ret </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ret </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> ret </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> next </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> next</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>next </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">tmp </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong> <span style="font-family: 宋体; color: #ff8000;">2</span> <strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> next</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> next</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: navy;">}</span></strong> <strong><span style="font-family: 宋体; color: blue;">else</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><strong><span style="font-family: 宋体; color: blue;">auto</span></strong><span style="font-family: 宋体; color: black;"> tmp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ret</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ret </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">next </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong> <span style="font-family: 宋体; color: #ff8000;">2</span> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> ret</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> ret</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>next </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> tmp </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> tmp </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> next </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> next</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> ret</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> fib_basic</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> num</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> </p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">if</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">num </span><strong><span style="font-family: 宋体; color: navy;">&lt;=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> num</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> prev </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8000;">0</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> current </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8000;">1</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">for</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><strong><span style="font-family: 宋体; color: blue;">uint</span></strong><span style="font-family: 宋体; color: black;"> i </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8000;">2</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;"> i </span><strong><span style="font-family: 宋体; color: navy;">&lt;=</span></strong><span style="font-family: 宋体; color: black;"> num</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong> <strong><span style="font-family: 宋体; color: navy;">++</span></strong><span style="font-family: 宋体; color: black;">i</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: blue;">auto</span></strong><span style="font-family: 宋体; color: black;"> tmp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> prev</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>prev </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> current</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong> </p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>current </span><strong><span style="font-family: 宋体; color: navy;">+=</span></strong><span style="font-family: 宋体; color: black;"> tmp</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> current</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">unittest</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">foreach</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">i</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong> <span style="font-family: 宋体; color: #ff8000;">0</span> <strong><span style="font-family: 宋体; color: navy;">..</span></strong> <span style="font-family: 宋体; color: #ff8000;">48</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong> </p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: blue;">auto</span></strong><span style="font-family: 宋体; color: black;"> a </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> fib_basic</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">i</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> b </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> fib_matrix</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">i</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> c </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> fib</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">i</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: blue;">if</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">a </span><strong><span style="font-family: 宋体; color: navy;">!=</span></strong><span style="font-family: 宋体; color: black;"> b </span><strong><span style="font-family: 宋体; color: navy;">||</span></strong><span style="font-family: 宋体; color: black;"> a </span><strong><span style="font-family: 宋体; color: navy;">!=</span></strong><span style="font-family: 宋体; color: black;"> c</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> </p>  <p align="left"><span style="font-family: 宋体; color: black;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>writef</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: gray;">"%s %s %s %s\n"</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> i</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> b</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> c</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;</span><strong><span style="font-family: 宋体; color: navy;">}</span></strong><span style="font-family: 宋体; color: black;">&nbsp;</span></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">void</span></strong><span style="font-family: 宋体; color: black;"> main</span><strong><span style="font-family: 宋体; color: navy;">()</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left">&nbsp;</p>  <p><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p><img src ="http://www.cppblog.com/flyinghearts/aggbug/151510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-07-20 23:30 <a href="http://www.cppblog.com/flyinghearts/archive/2011/07/20/151510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>点在三角形内　之二 （三维坐标系1）</title><link>http://www.cppblog.com/flyinghearts/archive/2011/07/14/151020.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Thu, 14 Jul 2011 15:28:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/07/14/151020.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/151020.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/07/14/151020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/151020.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/151020.html</trackback:ping><description><![CDATA[<div><p style="text-indent: 21pt;"><span style="font-family: 宋体;"><a href="http://www.cnblogs.com/flyinghearts/archive/2011/07/07/2100549.html">前一篇文章</a></span><span style="font-family: 宋体;">讨论了二维坐标系下的判断，下面讨论三维的情况。</span></p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">三维坐标下，对点的判断明显要复杂很多。如果google&#8220;Point in triangle&#8221;，第一个搜索结果就是这个<a href="http://www.blackpawn.com/texts/pointinpoly/default.html"><span>网<span>页</span></span></a></span>，可惜的是，作者没有对结果进一步讨论，没有给出一个好的实现，而且其<strong><span style="color: #993300;">所有结论只在已知四点共面时才成立</span></strong>。</p><p>&nbsp;</p><div><span style="font-family: 宋体;"><div align="center"><img alt="" src="http://images.cnblogs.com/cnblogs_com/flyinghearts/triangle_point.PNG" height="207" width="220" /></div></span></div>&nbsp;<p>&nbsp;</p>  <p style="text-indent: 10.5pt;">&nbsp;</p>  <p style="text-indent: 10.5pt;"><span style="font-family: 宋体;"><a href="http://www.cnblogs.com/flyinghearts/archive/2011/07/07/2100549.html">前面</a></span><span style="font-family: 宋体;">已经证明过，面积法和向量同向法是等价的。</span></p>  <p style="text-indent: 21.1pt;"><strong><span style="font-family: 宋体; color: blue;">ab &#215; ac = ab &#215; ap + ap &#215; ac + pb &#215; pc</span></strong></p>  <p style="text-indent: 21.1pt;"><strong><span style="font-family: 宋体; color: blue;">|ab &#215; ac| = |ab &#215; ap| + |ap &#215; ac| + |pb &#215; pc| </span></strong></p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">由于<span style="color: black;">ab &#215; ac</span><span style="color: black;">、ab &#215; ap、ap &#215; ac、pb &#215; pc</span>这4个向量平行同向，因而可以先判断<strong><span style="color: #993300;">a</span><span style="color: #993300;">、b、c、p这四点是否共面（通过计算混合积），若共面的话，则4个向量一定共线，接着只要判断后三个向量是否都和第一个向量（</span></strong><span style="color: #993300;">ab &#215; ac</span><strong><span style="color: #993300;">）同向（可以通过判断后三个向量与第一个向量的点积的正负性来确定）</span>。</strong></span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">代码：</span></p>  <p align="left">&nbsp;</p><div>  <p><span style="font-family: 宋体; color: #804000;">#include&lt;cfloat&gt;</span></p>  </div>  <p align="left"><span style="font-family: 宋体; color: #8000ff;">template</span><strong><span style="font-family: 宋体; color: navy;">&lt;</span></strong><span style="font-family: 宋体; color: #8000ff;">typename</span><span style="font-family: 宋体; color: black;"> T</span><strong><span style="font-family: 宋体; color: navy;">&gt;</span></strong> <span style="font-family: 宋体; color: #8000ff;">class</span><span style="font-family: 宋体; color: black;"> Vec3 </span><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;T x</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> y</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> z</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: #8000ff;">public</span><strong><span style="font-family: 宋体; color: navy;">:</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;Vec3</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">T xx</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> T yy</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> T zz</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">:</span></strong><span style="font-family: 宋体; color: black;"> x</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">xx</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> y</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">yy</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> z</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">zz</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">{}</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;Vec3 </span><strong><span style="font-family: 宋体; color: blue;">operator</span></strong><strong><span style="font-family: 宋体; color: navy;">-(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vec3</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span> <strong><span style="font-family: 宋体; color: navy;">{</span></strong> <strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> Vec3</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">x </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">x</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> y </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">y</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> z </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">z</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> <strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;T dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vec3</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span> <strong><span style="font-family: 宋体; color: navy;">{</span></strong> <strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> x </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">x </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> y </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">y </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> z </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">z</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong> <strong><span style="font-family: 宋体; color: navy;">}</span></strong> </p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;Vec3 cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vec3</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span> <strong><span style="font-family: 宋体; color: navy;">{</span></strong> </p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> Vec3</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">y </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">z </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> z </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">y</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> z </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">x </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> x </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">z</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;">x </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">y </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> y </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">x</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">};</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">typedef</span></strong><span style="font-family: 宋体; color: black;"> Vec3</span><strong><span style="font-family: 宋体; color: navy;">&lt;</span></strong><span style="font-family: 宋体; color: #8000ff;">double</span><strong><span style="font-family: 宋体; color: navy;">&gt;</span></strong><span style="font-family: 宋体; color: black;"> V3d</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;</p>  <p><span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">方法一</span></p>  <p align="left"><span style="font-family: 宋体; color: #8000ff;">bool</span><span style="font-family: 宋体; color: black;"> is_in_triangle3a</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> V3d</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> V3d</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> b</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> V3d</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> c</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> V3d</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> p</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;V3d ab</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">b </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ac</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">c </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">p </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;">a</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">if</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">).</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ap</span><strong><span style="font-family: 宋体; color: navy;">))</span></strong> <strong><span style="font-family: 宋体; color: navy;">&gt;=</span></strong><span style="font-family: 宋体; color: black;"> DBL_EPSILON</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: blue;">return</span></strong> <strong><span style="font-family: 宋体; color: blue;">false</span></strong><strong><span style="font-family: 宋体; color: navy;">;</span></strong>&nbsp;<span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">四点不共面</span></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;V3d abc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> abp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ap</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> apc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> t0 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> abc</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abc</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> t1 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> abp</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abc</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> t2 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> apc</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abc</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//t1 &gt;= 0&nbsp;&nbsp;&nbsp;&nbsp; t2 &gt;= 0&nbsp;&nbsp;&nbsp; t1 + t2 &lt;= t0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t0</span><span style="font-family: 宋体; color: green;">肯定大于0</span></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">// return&nbsp;(t1 &gt;= -DBL_EPSILON) &amp; (t2 &gt;= -DBL_EPSILON) &amp; (t0 - t1 - t2 &gt;= -DBL_EPSILON);</span></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> delta </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">t1</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">t2</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">t0 </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> t1 </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> t2</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> t0</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;</span><strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">delta</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">&lt;</span></strong><span style="font-family: 宋体; color: black;"> DBL_EPSILON</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong>&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left">&nbsp;</p>  <p style="text-indent: 21.1pt;"><strong><span style="font-family: 宋体; color: blue;">方法一，需要30次乘法计算。即使在已知四点共面的情况下，仍需要27次乘法计算</span></strong><span style="font-family: 宋体;">，仅节省了3次乘法计算。考虑到每次计算向量积需要6次乘法计算，而计算点积只要3次乘法计算，因而可以考虑消除向量积计算：</span></p>    <p>&nbsp;</p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">利用公式：</span></p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">&nbsp;(a &#215; b)</span><span style="font-family: 宋体;">&#183;<span> c</span></span><span style="font-family: 宋体;"> = (c </span><span style="font-family: 宋体;">&#215; a)&#183; b　　　&nbsp;&nbsp;&nbsp; （混合积）</span></p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">&nbsp;a &#215; (b &#215; c) = b</span><span style="font-family: 宋体;">（a&#183;c）</span>&#8722;<span style="font-family: 宋体;"> c</span><span style="font-family: 宋体;">（a&#183;b） &nbsp;(拉格朗日公式)</span></p>  <p><span style="font-family: 宋体;">可得：</span></p>  <p style="text-indent: 21pt;"><strong><span style="font-family: 宋体; color: blue;">(a &#215; b)</span></strong><strong><span style="font-family: 宋体; color: blue;">&#183;(a &#215;<span> c)</span></span></strong><span style="font-family: 宋体;"> = ((a </span><span style="font-family: 宋体;">&#215;</span><span style="font-family: 宋体;"> c) </span><span style="font-family: 宋体;">&#215; a)&#183;b = ((a&#183;a)c &#8211; (a&#183;c)a)&#183;b</span></p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">= <strong><span style="color: blue;">(a</span></strong></span><strong><span style="font-family: 宋体; color: blue;">&#183;a) * (b&#183;c) &#8211; (a&#183;c) * (a&#183;b)</span></strong></p>  <p style="text-indent: 21pt;">&nbsp;</p>  <p><span style="font-family: 宋体;">利用这个展开式，可得：</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">方法二</span></p>    <p align="left"><span style="font-family: 宋体; color: #8000ff;">bool</span><span style="font-family: 宋体; color: black;"> is_in_triangle3b</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> V3d</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> V3d</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> b</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> V3d</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> c</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> V3d</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> p</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;V3d ab</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">b </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ac</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">c </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">p </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;">a</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">if</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">).</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ap</span><strong><span style="font-family: 宋体; color: navy;">))</span></strong> <strong><span style="font-family: 宋体; color: navy;">&gt;=</span></strong><span style="font-family: 宋体; color: black;"> DBL_EPSILON</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: blue;">return</span></strong> <strong><span style="font-family: 宋体; color: blue;">false</span></strong><strong><span style="font-family: 宋体; color: navy;">;</span></strong>&nbsp;<span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">四点不共面</span></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;V3d abc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> abp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ap</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> apc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//double t0 = abc.dot(abc), t1 = abp.dot(abc), t2 = apc.dot(abc); //</span><span style="font-family: 宋体; color: green;">对这三个计算公式进行展开</span></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> v11 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ab</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> v22 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ac</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> v12 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> v13 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ap</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> v23 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ac</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">dot</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ap</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> t0 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> v11 </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v22 </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> v12 </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v12</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> t1 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> v11 </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v23 </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> v12 </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v13</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> t2 </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> v22 </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v13 </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> v12 </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v23</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> delta </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">t1</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">t2</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">t0 </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> t1 </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> t2</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> t0</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">delta</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">&lt;</span></strong><span style="font-family: 宋体; color: black;"> DBL_EPSILON</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong>&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong> </p>  <p>&nbsp;</p>  <p style="text-indent: 21.1pt;"><strong><span style="font-family: 宋体; color: blue;">方法二，需要30次乘法计算，但在已知四点共面时则只需要21次乘法计算</span></strong><span style="font-family: 宋体;">。</span></p>  <p>&nbsp;</p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">上面的两种方法，<span style="color: #993300;">方法一</span>，容易记，容易实现，且在<strong><span style="color: #993300;">不能确定四点共面</span></strong><span style="color: #993300;">时，效率与方法二差不多</span>（甚至可能略高）；而方法二最大的优点，则是在<strong><span style="color: #993300;">已知四点共面</span></strong>时，比方法一<strong><span style="color: #993300;">少用6次</span></strong>乘法，但是实现起来实在麻烦。那么，是否存在更好的方法呢？答案是肯定的，这就是后面要提到的方法（多一次条件判断，只要<strong><span style="color: #993300;">13</span><span style="color: #993300;">次</span></strong>乘法（四点共面时只要<strong><span style="color: #993300;">8</span><span style="color: #993300;">次</span></strong>））。</span></p>  <p style="text-indent: 21pt;">&nbsp;</p>  <br />作者：<a href="http://www.cnblogs.com/flyinghearts/"> flyinghearts </a><br />出处：<a href="http://www.cnblogs.com/flyinghearts/"> http://www.cnblogs.com/flyinghearts/ </a><br />本文采用<a href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/">知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议</a>进行许可，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。</div><img src ="http://www.cppblog.com/flyinghearts/aggbug/151020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-07-14 23:28 <a href="http://www.cppblog.com/flyinghearts/archive/2011/07/14/151020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>点在多边形内</title><link>http://www.cppblog.com/flyinghearts/archive/2011/07/11/150716.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Mon, 11 Jul 2011 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/07/11/150716.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/150716.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/07/11/150716.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/150716.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/150716.html</trackback:ping><description><![CDATA[<br />射线法：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><img id="Code_Closed_Image_224331" onclick="this.style.display='none'; Code_Closed_Text_224331.style.display='none'; Code_Open_Image_224331.style.display='inline'; Code_Open_Text_224331.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"><img id="Code_Open_Image_224331" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_224331.style.display='none'; Code_Closed_Image_224331.style.display='inline'; Code_Closed_Text_224331.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><span id="Code_Closed_Text_224331" style="border: 1px solid #808080; background-color: #ffffff;">射线法</span><span id="Code_Open_Text_224331" style="display: none;"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cfloat</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cassert</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;Point&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;Point()&nbsp;{}<br />&nbsp;&nbsp;Point(</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;xx,&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;yy)&nbsp;:&nbsp;x(xx),&nbsp;y(yy)&nbsp;{}<br />};<br /><br /></span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;is_in_polygon(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Point&nbsp;arr[],&nbsp;size_t&nbsp;len,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Point</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;p)<br />{<br />&nbsp;&nbsp;size_t&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.x,&nbsp;y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.y;<br />&nbsp;&nbsp;Point&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;arr[len&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Point</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;arr;&nbsp;b&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;arr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;len;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">b</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((a.y&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;y)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;(b</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">y&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;y))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(a.y&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;b</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">y&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;a.y&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;fabs(fabs(a.x&nbsp;-&nbsp;b-&gt;x)&nbsp;-&nbsp;fabs(a.x&nbsp;-&nbsp;x)&nbsp;-&nbsp;fabs(b-&gt;x&nbsp;-&nbsp;x))&nbsp;&lt;&nbsp;DBL_EPSILON)</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((a.x&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;b</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">x&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;x)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;(a.x&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;b</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">x&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;x)))&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">水平线PP与线段ab的交点，该交点与点p间的水平相对位置</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;delta&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;a.y)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;(b</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">x&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;a.x)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;(b</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;a.y)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;a.x&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(delta&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;DBL_EPSILON)&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">count;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">水平射线PP与线段相交</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(delta&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">DBL_EPSILON)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">点p在线段ab上</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;count&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />}<br /><br /><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br />{<br />&nbsp;&nbsp;Point&nbsp;point[</span><span style="color: #000000;">3</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">},&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">},&nbsp;{</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">}};<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(</span><span style="color: #000000;">-</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">2</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />}<br /><br />&nbsp;&nbsp;</span></span></div><br />矢量同向法：（适用于凸多边形）<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><img id="Code_Closed_Image_224617" onclick="this.style.display='none'; Code_Closed_Text_224617.style.display='none'; Code_Open_Image_224617.style.display='inline'; Code_Open_Text_224617.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"><img id="Code_Open_Image_224617" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_224617.style.display='none'; Code_Closed_Image_224617.style.display='inline'; Code_Closed_Text_224617.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><span id="Code_Closed_Text_224617" style="border: 1px solid #808080; background-color: #ffffff;">矢量同向法</span><span id="Code_Open_Text_224617" style="display: none;"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cstdio</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cmath</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cfloat</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cassert</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;Vector&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;Vector()&nbsp;{}<br />&nbsp;&nbsp;Vector(</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;xx,&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;yy)&nbsp;:&nbsp;x(xx),&nbsp;y(yy)&nbsp;{}<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;cross(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Vector</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;v)&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;v.y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;v.x;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;Vector&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">-</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Vector</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;v)&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Vector(x&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;v.x,&nbsp;y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;v.y);&nbsp;}<br />};<br /><br /></span><span style="color: #008000;">//</span><span style="color: #008000;">适用于凸多边形</span><span style="color: #008000;"><br /></span><span style="color: #000000;">inline&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;is_in_polygon(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Vector&nbsp;vec[],&nbsp;size_t&nbsp;len,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Vector</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;v)<br />{<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;sum_area&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;total_area&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />&nbsp;&nbsp;Vector&nbsp;va&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec[len&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Vector</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;vb&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vec;&nbsp;vb&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;vec&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;len;&nbsp;va&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">vb</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;area&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(va&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;v).cross(</span><span style="color: #000000;">*</span><span style="color: #000000;">vb&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;v);<br />&nbsp;&nbsp;&nbsp;&nbsp;sum_area&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;area;<br />&nbsp;&nbsp;&nbsp;&nbsp;total_area&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;fabs(area);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;fabs(fabs(sum_area)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;total_area)&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;DBL_EPSILON;<br />}<br /><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br />{<br />&nbsp;&nbsp;typedef&nbsp;Vector&nbsp;Point;<br />&nbsp;&nbsp;Point&nbsp;point[</span><span style="color: #000000;">3</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">},&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">},&nbsp;{</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">}};<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(</span><span style="color: #000000;">-</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">2</span><span style="color: #000000;">))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;assert(is_in_polygon(point,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;Point(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">))&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />}<br /></span></span></div><img src ="http://www.cppblog.com/flyinghearts/aggbug/150716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-07-11 22:47 <a href="http://www.cppblog.com/flyinghearts/archive/2011/07/11/150716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>点在三角形内（1）</title><link>http://www.cppblog.com/flyinghearts/archive/2011/07/07/150424.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Thu, 07 Jul 2011 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/07/07/150424.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/150424.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/07/07/150424.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/150424.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/150424.html</trackback:ping><description><![CDATA[<div><div id="cnblogs_post_body"><div><strong><span style="font-family: 宋体;">问题：判断点</span>P</strong><strong><span style="font-family: 宋体;">是否在三角形</span>ABC</strong><strong><span style="font-family: 宋体;">内</span></strong>  <p><br /></p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">判断一个点是否在在三角形内，最常用的两种方法：面积法、向量同向法。算法虽然很简单，但要做到高效却不容易，要考虑到二维、三维的区别，还要考虑到坐标是用浮点数还是用整数来表示。</span></p>  <p style="text-indent: 21pt;">&nbsp;</p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">在二维平面上，问题相对简单，一般只需</span>6<span style="font-family: 宋体;">次乘法计算。但在三维平面时问题要复杂很多，在网上看到的算法，一般都需要</span><strong><span style="color: blue;">30</span></strong><span style="font-family: 宋体;">次乘法计算（如果已知点</span>P<span style="font-family: 宋体;">在平面</span>ABC<span style="font-family: 宋体;">上，则需</span><strong><span style="color: blue;">21</span></strong><span style="font-family: 宋体;">次）。实际上，在三维坐标系下，可以做到增加</span>1<span style="font-family: 宋体;">次比较，将乘法计算降到</span><strong><span style="color: blue;">13</span></strong><span style="font-family: 宋体;">次（如果点</span>P<span style="font-family: 宋体;">在平面</span>ABC<span style="font-family: 宋体;">上，则最多只要</span><strong><span style="color: blue;">8</span></strong><span style="font-family: 宋体;">次乘法计算）。</span></p>  <p>&nbsp;</p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">最常用的两种方法：面积法和向量同向法本质上是等价的。</span></p>  <p style="margin-left: 84pt; text-indent: -63pt;"><span style="font-family: 宋体;">向量同向法：若点</span>P<span style="font-family: 宋体;">在三角形内，则三个向量：</span>ab &#215; ap<span style="font-family: 宋体;">、</span>ap &#215; ac<span style="font-family: 宋体;">、</span>pb &#215; pc<span style="font-family: 宋体;">平行同向（它们也与向量</span>ab &#215; ac<span style="font-family: 宋体;">平行同向），由于这三个向量均有可能为</span>0<span style="font-family: 宋体;">，直接判断它们平行同向相当麻烦，但考虑到</span>ab &#215; ac<span style="font-family: 宋体;">不可能为</span>0<span style="font-family: 宋体;">，直接判断&#8220;<strong><span style="color: #993300;">向量：</span></strong></span><strong><span style="color: #993300;">ab &#215; ap</span></strong><strong><span style="font-family: 宋体; color: #993300;">、</span><span style="color: #993300;">ap &#215; ac</span></strong><strong><span style="font-family: 宋体; color: #993300;">、</span><span style="color: #993300;">pb &#215; pc</span></strong><strong><span style="font-family: 宋体; color: #993300;">均与</span><span style="color: #993300;">ab &#215; ac</span></strong><strong><span style="font-family: 宋体; color: #993300;">平行同向</span></strong><span style="font-family: 宋体;">&#8221;反而更简单。</span></p>  <p style="margin-left: 84pt; text-indent: -63pt;">&nbsp;</p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">面积法：当点</span>p<span style="font-family: 宋体;">在三角形</span>abc<span style="font-family: 宋体;">内时，</span>4<span style="font-family: 宋体;">个三角形的面积满足：</span> abc&nbsp;= abp + apc + pbc</p>  <p style="text-indent: 63pt;"><span style="font-family: 宋体;">对面积的计算，可以通过向量的向量积计算得到：</span> <span style="font-family: 宋体;">面积</span> abc&nbsp;= |ab &#215; ac| / 2</p>  <p style="text-indent: 63pt;"><span style="font-family: 宋体;">表面上，要计算</span>4<span style="font-family: 宋体;">个三角形的面积，但根据下面的公式：</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ap &#215; ap = 0,&nbsp;<strong><span style="color: #993300;">pb &#215; pc = (ab - ap) &#215; (ac - ap) = ab &#215; ac - ab &#215; ap - ap &#215; ac</span></strong></p>  <p style="text-indent: 63.25pt;"><strong><span style="font-family: 宋体; color: #993300;">可以少算一次矢量积</span></strong><span style="font-family: 宋体;">。</span></p>  <p style="text-indent: 57.75pt;"><span style="font-family: 宋体;">公式：</span> <span style="color: blue;">|ab &#215; ac| = |ab &#215; ap| + |ap &#215; ac| + |(ab &#215; ac - ab &#215; ap - ap &#215; ac)| </span></p>  <p style="text-indent: 57.75pt;">&nbsp;</p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">对任意向量</span>a<span style="font-family: 宋体;">、</span>b<span style="font-family: 宋体;">、</span>c<span style="font-family: 宋体;">：</span><span>&nbsp;&nbsp; |a + b + c| = |a| + |b| + |c|&nbsp;&lt;==&gt;&nbsp;</span><span style="font-family: 宋体;">向量</span>a<span style="font-family: 宋体;">、</span>b<span style="font-family: 宋体;">、</span>c <span style="font-family: 宋体;">平行同向</span></p>  <p>&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体;">因而，面积法和向量同向法本质上是等价的。</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p style="text-indent: 15.75pt;"><span style="font-family: 宋体;">下面先讨论二维坐标系（每个点</span>X<span style="font-family: 宋体;">，都看作是原点</span>O<span style="font-family: 宋体;">到该点</span>X<span style="font-family: 宋体;">的二维向量</span>OX<span style="font-family: 宋体;">）。</span></p>  <p style="text-indent: 15.75pt;"><span style="font-family: 宋体;">先定义一个二维向量模板：</span></p>  <p>&nbsp;</p>  <p align="left"><span style="font-family: 宋体; color: #8000ff;">template</span><strong><span style="font-family: 宋体; color: navy;">&lt;</span></strong><span style="font-family: 宋体; color: #8000ff;">typename</span><span style="font-family: 宋体; color: black;"> T</span><strong><span style="font-family: 宋体; color: navy;">&gt;</span></strong> <span style="font-family: 宋体; color: #8000ff;">class</span><span style="font-family: 宋体; color: black;"> Vec2 </span><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;T x</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> y</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: #8000ff;">public</span><strong><span style="font-family: 宋体; color: navy;">:</span></strong></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">typedef</span></strong><span style="font-family: 宋体; color: black;"> T value_type</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;Vec2</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">T xx </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8040;">0</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> T yy </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <span style="font-family: 宋体; color: #ff8040;">0</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">:</span></strong><span style="font-family: 宋体; color: black;"> x</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">xx</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> y</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">yy</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">{};</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;T cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vec2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span> <strong><span style="font-family: 宋体; color: navy;">{</span></strong> <strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> x </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">y </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> y </span><strong><span style="font-family: 宋体; color: navy;">*</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">x</span><strong><span style="font-family: 宋体; color: navy;">;}</span></strong>&nbsp;<span style="font-family: 宋体; color: green;">// </span><span style="font-family: 宋体; color: green;">矢量积</span></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;Vec2 </span><strong><span style="font-family: 宋体; color: blue;">operator</span></strong><strong><span style="font-family: 宋体; color: navy;">-(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vec2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span> <strong><span style="font-family: 宋体; color: navy;">{</span></strong> <strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> Vec2</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">x </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">x</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> y </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> v</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">y</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> <strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">};</span></strong></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">如果坐标采用浮点数，考虑到浮点数取绝对值方便（有专门的浮点指令），但彼此间比较大小存在误差，采用面积法比较方便：</span></p>    <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">typedef</span></strong><span style="font-family: 宋体; color: black;"> Vec2</span><strong><span style="font-family: 宋体; color: navy;">&lt;</span></strong><span style="font-family: 宋体; color: #8000ff;">double</span><strong><span style="font-family: 宋体; color: navy;">&gt;</span></strong><span style="font-family: 宋体; color: black;"> Vd2</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family: 宋体; color: #8000ff;">bool</span><span style="font-family: 宋体; color: black;"> is_in_triangle</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vd2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vd2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> b</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vd2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> c</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vd2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> p</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;Vd2 ab</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">b </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;">a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ac</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">c </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">p </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">用矢量积计算面积，下面4个值的绝对值，是对应的三角形的面积的两倍，</span></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> abc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> </p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> abp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ap</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> apc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> </p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> pbc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> abc </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> abp </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> apc</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;">&nbsp;&nbsp; </span><span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">等于pb.cross(pc)</span></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">面积法：4个三角形的面积差 等于 0</span></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">double</span><span style="font-family: 宋体; color: black;"> delta </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abc</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abp</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">apc</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">pbc</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> </p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> fabs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">delta</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">&lt;</span></strong><span style="font-family: 宋体; color: black;"> DBL_EPSILON</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p style="text-indent: 21pt;"><span style="font-family: 宋体;">如果坐标采用整数表示，代码相对麻烦点：</span></p>  <p style="text-indent: 21pt;">&nbsp;</p>  <p align="left"><strong><span style="font-family: 宋体; color: blue;">typedef</span></strong><span style="font-family: 宋体; color: black;"> Vec2</span><strong><span style="font-family: 宋体; color: navy;">&lt;</span></strong><span style="font-family: 宋体; color: #8000ff;">int</span><strong><span style="font-family: 宋体; color: navy;">&gt;</span></strong><span style="font-family: 宋体; color: black;"> Vi2</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family: 宋体; color: #8000ff;">bool</span><span style="font-family: 宋体; color: black;"> is_in_triangle</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vi2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vi2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> b</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vi2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> c</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vi2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> p</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;Vi2 ab</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">b </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;">a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ac</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">c </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">p </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">用矢量积计算面积，下面4个值的绝对值，是对应的三角形的面积的两倍，</span></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> abc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> </p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> abp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ap</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> apc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> </p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> pbc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> abc </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> abp </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> apc</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;">&nbsp;&nbsp; </span><span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">等于pb.cross(pc)</span></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">方法1： 面积法：4个三角形的面积差 等于 0</span></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">return</span></strong><span style="font-family: 宋体; color: black;"> abs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abc</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">==</span></strong><span style="font-family: 宋体; color: black;"> abs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abp</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> abs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">apc</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> abs</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">pbc</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">方法2： 矢量同向法： abp apc pbc 均与 abc 同向：</span></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">if</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abc </span><strong><span style="font-family: 宋体; color: navy;">&lt;</span></strong> <span style="font-family: 宋体; color: #ff8040;">0</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">{</span></strong><span style="font-family: 宋体; color: black;"> abp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;">abp</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;"> apc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;">apc</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;"> pbc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;">pbc</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong> <strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">return</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abp </span><strong><span style="font-family: 宋体; color: navy;">&gt;=</span></strong> <span style="font-family: 宋体; color: #ff8040;">0</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">apc </span><strong><span style="font-family: 宋体; color: navy;">&gt;=</span></strong> <span style="font-family: 宋体; color: #ff8040;">0</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">pbc </span><strong><span style="font-family: 宋体; color: navy;">&gt;=</span></strong> <span style="font-family: 宋体; color: #ff8040;">0</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> </p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>    <p align="left">&nbsp;</p>  <p style="margin-left: 36.75pt; text-align: left; text-indent: -36.75pt;" align="left"><span style="font-family: 宋体; color: black;">方法1：要计算4次绝对值，看似需要4次条件跳转，但主流的编译器，都能采用</span><span style="font-family: 宋体;">位运算直接计算绝对值（<strong>注意：</strong></span><strong>GCC</strong><strong><span style="font-family: 宋体;">需要加额外的参数</span></strong><span style="font-family: 宋体;">），不需要任何条件跳转。</span></p>  <p align="left"><span style="font-family: 宋体; color: black;">方法2：比方法1指令少，但多1次条件跳转。</span></p>  <p><span style="font-family: 宋体; color: black;">哪种方法效率较高，与编译器生成的具体代码有关。</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">上面代码中，可采用的两种优化方法：</span></p>  <p><span style="font-family: 宋体;">&#9312;　对整数</span>x<span style="font-family: 宋体;">取绝对值，可以利用位运算：</span></p>  <p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">设</span>&nbsp;y = 0 <span style="font-family: 宋体;">（当</span>x &gt;= 0<span style="font-family: 宋体;">）</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;= -1 <span style="font-family: 宋体;">（当</span>x &lt; 0<span style="font-family: 宋体;">）</span> </p>  <p>&nbsp;<span style="font-family: 宋体;">（编译器可以利用</span>cdq<span style="font-family: 宋体;">或</span>sar<span style="font-family: 宋体;">等指令直接由</span>x<span style="font-family: 宋体;">计算出</span>y<span style="font-family: 宋体;">值）</span></p>  <p>&nbsp;<span style="font-family: 宋体;">则</span>&nbsp;<strong>abs(x) &nbsp;= &nbsp;(x xor y) &#8211; y</strong></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">或：</span>&nbsp;&nbsp; <strong>=&nbsp;(x + y) xor y</strong></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">或：</span>&nbsp;&nbsp; <strong>=&nbsp;x &#8211; (2 * x &amp; y)</strong></p>  <p>&nbsp;</p>  <p>&nbsp;<span style="font-family: 宋体;">&#9313;</span> <span style="font-family: 宋体;">对整数</span>a<span style="font-family: 宋体;">、</span>b<span style="font-family: 宋体;">、</span>c<span style="font-family: 宋体;">，</span>&nbsp;<strong>a &gt;= 0 &amp;&amp; b &gt;= 0 &amp;&amp; c &gt;= 0</strong> <span style="font-family: 宋体;">等价于</span> </p>  <p style="text-indent: 21.1pt;"><strong>(a &gt;= 0) &amp; (b &gt;= 0) &amp; (c &gt;= 0) </strong><span style="font-family: 宋体;">等价于：</span></p>  <p style="text-indent: 21.1pt;"><strong>(a | b | c) &gt;= 0</strong></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: black;">为避免编译器没有进行相关优化，直接手动优化，可得：</span></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family: 宋体; color: #8000ff;">inline</span> <span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> chg_sign</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> x</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> sign</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <span style="font-family: 宋体; color: green;">//sign</span><span style="font-family: 宋体; color: green;">只能取0或-1，函数分别返回x、-x</span></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">return</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">x </span><strong><span style="font-family: 宋体; color: navy;">+</span></strong><span style="font-family: 宋体; color: black;"> sign</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">^</span></strong><span style="font-family: 宋体; color: black;"> sign</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong> </p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//return (x ^ sign) - sign; </span></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family: 宋体; color: #8000ff;">bool</span><span style="font-family: 宋体; color: black;"> is_in_triangle</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vi2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vi2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> b</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vi2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> c</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong> <span style="font-family: 宋体; color: #8000ff;">const</span><span style="font-family: 宋体; color: black;"> Vi2</span><strong><span style="font-family: 宋体; color: navy;">&amp;</span></strong><span style="font-family: 宋体; color: black;"> p</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">{</span></strong></p>  <p align="left"><span style="font-family: 宋体; color: black;">&nbsp;Vi2 ab</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">b </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;">a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ac</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">c </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">),</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">p </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> a</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">用矢量积计算面积，下面4个值的绝对值，是对应的三角形的面积的两倍，</span></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> abc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> </p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> abp </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ab</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ap</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> apc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> ap</span><strong><span style="font-family: 宋体; color: navy;">.</span></strong><span style="font-family: 宋体; color: black;">cross</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">ac</span><strong><span style="font-family: 宋体; color: navy;">);</span></strong> </p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> pbc </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong><span style="font-family: 宋体; color: black;"> abc </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> abp </span><strong><span style="font-family: 宋体; color: navy;">-</span></strong><span style="font-family: 宋体; color: black;"> apc</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong><span style="font-family: 宋体; color: black;">&nbsp;&nbsp; </span><span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">等于pb.cross(pc)</span></p>  <p align="left">&nbsp;</p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//</span><span style="font-family: 宋体; color: green;">方法3： 矢量同向法（优化版）</span></p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: #8000ff;">const</span> <span style="font-family: 宋体; color: #8000ff;">int</span><span style="font-family: 宋体; color: black;"> sign </span><strong><span style="font-family: 宋体; color: navy;">=</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abc </span><strong><span style="font-family: 宋体; color: navy;">&gt;=</span></strong> <span style="font-family: 宋体; color: #ff8040;">0</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">-</span></strong> <span style="font-family: 宋体; color: #ff8040;">1</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong> </p>  <p align="left">&nbsp;<span style="font-family: 宋体; color: green;">//const int sign = abc &gt;&gt; (sizeof(abc) * CHAR_BIT - 1);</span></p>  <p align="left">&nbsp;<strong><span style="font-family: 宋体; color: blue;">return</span></strong> <strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">chg_sign</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">abp</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> sign</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">|</span></strong><span style="font-family: 宋体; color: black;"> chg_sign</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">apc</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> sign</span><strong><span style="font-family: 宋体; color: navy;">)</span></strong> <strong><span style="font-family: 宋体; color: navy;">|</span></strong><span style="font-family: 宋体; color: black;"> chg_sign</span><strong><span style="font-family: 宋体; color: navy;">(</span></strong><span style="font-family: 宋体; color: black;">pbc</span><strong><span style="font-family: 宋体; color: navy;">,</span></strong><span style="font-family: 宋体; color: black;"> sign</span><strong><span style="font-family: 宋体; color: navy;">))</span></strong> <strong><span style="font-family: 宋体; color: navy;">&gt;=</span></strong> <span style="font-family: 宋体; color: #ff8040;">0</span><strong><span style="font-family: 宋体; color: navy;">;</span></strong></p>  <p align="left"><strong><span style="font-family: 宋体; color: navy;">}</span></strong></p>  <p>&nbsp;</p>  </div></div><br />作者：<a href="http://www.cnblogs.com/flyinghearts/"> flyinghearts </a><br />出处：<a href="http://www.cnblogs.com/flyinghearts/"> http://www.cnblogs.com/flyinghearts/ </a><br />本文采用<a href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/">知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议</a>进行许可，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。</div><img src ="http://www.cppblog.com/flyinghearts/aggbug/150424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-07-07 23:16 <a href="http://www.cppblog.com/flyinghearts/archive/2011/07/07/150424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组左旋转k位 —— C++标准算法库中最悲剧的函数：rotate</title><link>http://www.cppblog.com/flyinghearts/archive/2011/05/27/147403.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Fri, 27 May 2011 13:04:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/05/27/147403.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/147403.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/05/27/147403.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/147403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/147403.html</trackback:ping><description><![CDATA[<br /><div><p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">要将一个数组的所有元素向左旋转</span>k<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">位，通常有三种算法：</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">算法</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（</span><span style="font-family: 宋体">分组交换）：</span></p>  <p style="text-indent:26.25pt;"><span style="font-family:宋体">若a长度大于b，将ab分成a<sub>0</sub>a<sub>1</sub>b，交换a<sub>0</sub>和b，得ba<sub>1</sub>a<sub>0</sub>，只需再交换a<sub>1 </sub>和a<sub>0</sub>。</span></p>  <p style="text-indent:26.25pt;"><span style="font-family:宋体">若a长度小于b，将ab分成ab<sub>0</sub>b<sub>1</sub>，交换a和b<sub>0</sub>，得b<sub>0</sub>ab<sub>1</sub>，只需再交换a<sub> </sub>和b<sub>1</sub>。</span></p>  <p style="text-indent:26.25pt;"><span style="font-family:宋体">不断将数组划分和交换，直到不能再划分为止。分组过程与求最大公约数很相似。</span></p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体">&nbsp;</span><span style=" font-family:宋体">读写内存各 n到2*n次</span></p>  <p style="text-indent:15.75pt;">&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">算法</span>2 (<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">三次反转</span>)</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体">利用ba=(b<sup>r</sup>)<sup>r</sup>(a<sup>r</sup>)<sup>r</sup>=(a<sup>r</sup>b<sup>r</sup>)<sup>r</sup>，先分别反转a、b，最后再对所有元素进行一次反转。</span></p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体">读写内存各约2*n次</span></p>  <p style="text-indent:21.0pt;">&nbsp;</p>  <p><span style="font-family:宋体">算法3 （使用循环链）</span></p>  <p style="margin-left:21.0pt;"><span style="font-family:宋体">假设 n、k的最大公约数为M，则所有序号为<span> (i + j*k) % n (0&lt;= i &lt; M, 0 &lt;= j &lt; n/M)</span>的元素，构成M个循环链（i值相同的在同一个循环链上）， 每个循环链上的元素移动到前一个元素的元素，就可以交换到最终结果上的位置，因而总共只要读写内存各n次。（比如： 1 2 3 4 5 6，左移2位， 1 3 5 和 2 4 6分别构成两个循环链。）</span></p>  <p>&nbsp;</p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">事实上</span>C++<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">标准算法库提供了现成的函数：</span>rotate<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">函数。按理说，几种算法都比较简单，编译器的库函数又是经过时间检验的，效率即使比手写的差，也不会差太多。但如果对</span>rotate<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">函数进行测试的话，可能会发现标准库的版本慢得可不是一点点。</span></p>  <p style="text-indent:21.0pt;"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">对</span>VC 2010<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，运行后面的测试程序，自定义函数（采用算法</span>2<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）要用</span><span style="color:red">99ms</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，而</span>std::rotate<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">却要</span><span style="color:red">1656ms</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。是库的实现者不懂得用这个简单的算法吗？检查下库的源代码，就会发现：标准算法库中，对</span>C++<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的三种迭代器（前向迭代器、双向迭代器，随机访问迭代器），分别采用了上面三种算法。直接调用其内部的实现（</span>std::_Rotat<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">函数），重新测试下，可得到下面结果：</span></p>  <p style="text-indent:21.0pt;">&nbsp;</p>  <div align="center">  <table style="border-collapse:collapse;border:none;" border="1" cellpadding="0" cellspacing="0">  <tbody><tr>   <td style="border:solid windowtext 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt" valign="top">   <p style="text-align:center;text-indent:10.5pt;" align="center"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">迭代器</span></p>   </td>   <td style="border:solid windowtext 1.0pt;border-left:none;   padding:0cm 5.4pt 0cm 5.4pt" valign="top">   <p style="text-align:center" align="center"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">前向（算法</span>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）</span></p>   </td>   <td style="border:solid windowtext 1.0pt;border-left:none;   padding:0cm 5.4pt 0cm 5.4pt" valign="top">   <p style="text-align:center" align="center"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">双向（算法</span>2<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）</span></p>   </td>   <td style="border:solid windowtext 1.0pt;border-left:none;   padding:0cm 5.4pt 0cm 5.4pt" valign="top">   <p style="text-align:center" align="center"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">随机访问（算法</span>3<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）</span></p>   </td>  </tr>  <tr>   <td style="border:solid windowtext 1.0pt;border-top:none;   padding:0cm 5.4pt 0cm 5.4pt" valign="top">   <p style="text-align:center" align="center"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">时间（</span>ms<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）</span></p>   </td>   <td style="border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;   border-right:solid windowtext 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt" valign="top">   <p style="text-align:center" align="center">46</p>   </td>   <td style="border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;   border-right:solid windowtext 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt" valign="top">   <p style="text-align:center" align="center">99</p>   </td>   <td style="border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;   border-right:solid windowtext 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt" valign="top">   <p style="text-align:center" align="center">1651</p>   </td>  </tr> </tbody></table>  </div>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:7.5pt;font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（使用</span><span style="font-size:7.5pt">GCC</span><span style="font-size:7.5pt; font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的，请用版本号低于</span><span style="font-size:7.5pt">4.5</span><span style="font-size:7.5pt;font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的进行测试）</span></p>  <p>&nbsp;</p>  <p><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">从结果可以看出，效率是：<strong><span style="color:blue">算法</span></strong></span><strong><span style="color:blue">1 &gt; </span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:blue">算法</span><span style="color:blue">2 &gt;&gt;&gt; </span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:blue">算法</span><span style="color:blue">3</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。</span>&nbsp;</p>  <p>&nbsp;</p>  <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">从理论上讲，算法</span>3<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">只要读写内存各</span>n<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">次，应该是效率最高的算法。这在每次内存读写的开销相差不大时成立。但实际上，由于硬件限制，</span>CPU<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">对内存的访问采用分级缓存机制：一级缓存容量很小但访问速度最快，存放程序的指令和最常用的数据，而二、三级缓存容量较大但访问速度要慢很多。</span>CPU<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">是无法绕过缓存直接访问内存数据（某些特殊指令可以不用一二三级缓存，但它也要用到其它专用缓存），对不在缓存中的数据，必须先载入到缓存中，这个操作是相当昂贵的。对大数组来说，不可能将所有数据都存放在缓存中，而对内存的不连续访问，</span>CPU<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">对内存定位的开销（各级缓存间数据的调整，反复移入或移出数据到缓存）是巨大的，这就造成了算法</span>3<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的性能在该情况下非常差。测试发现，</span>k = 3<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">时，该算法的效率就已经相当差了。对小数组，尽管该算法读写次数少，但由于各种算法所用时间都很小，这种优势很难体现出来。可以说，<strong><span style="color:blue">算法</span></strong></span><strong><span style="color:blue">3</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:blue">在数学上是非常优美的，但是在实际应用中，是一种相当差的算法。</span></strong></p>  <p style="text-indent:21.75pt"><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">对算法的选择，不应该忽视内存因素。</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在对随机访问迭代器版本的</span>roate<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">实现上犯这个错误的，可不仅仅是</span><strong><span style="color:blue">VC</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，还有著名的</span><strong><span style="color:blue">STL Port</span></strong><strong><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">、</span><span style="color:blue">GCC</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（</span><strong>GCC</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">从</span>4.5</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开始</span>libstdc++</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">改用算法</span>1</strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，并做了些优化），以及新兴的</span><strong><span style="color:blue">libc++</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。（其它的编译器</span>/<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">库没用过，也就没有测试。）</span></p>  <p>&nbsp;</p>  <p style="text-indent:21.75pt"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">另外，测试时发现</span><strong><span style="color:blue">VC 2010</span></strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;;color:blue">的一个</span><span style="color:blue">bug</span></strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">：前向迭代器的实现版本，当</span>k = 0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">时，程序直接挂了。</span></p>  <p>&nbsp;</p>  <p>测试代码：</p><p><br /></p>  </div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Closed_Image_210241" onclick="this.style.display='none'; Code_Closed_Text_210241.style.display='none'; Code_Open_Image_210241.style.display='inline'; Code_Open_Text_210241.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"><img id="Code_Open_Image_210241" style="display: none" onclick="this.style.display='none'; Code_Open_Text_210241.style.display='none'; Code_Closed_Image_210241.style.display='inline'; Code_Closed_Text_210241.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><span id="Code_Closed_Text_210241" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">rotate</span><span id="Code_Open_Text_210241" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;www.cnblogs.com/flyinghearts</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">algorithm</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iterator</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">ctime</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#if</span><span style="color: #000000; ">&nbsp;__GNUC__</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;ROTATE&nbsp;std::__rotate</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#elif</span><span style="color: #000000; ">&nbsp;_MSC_VER</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;ROTATE&nbsp;std::_Rotate</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">#error</span><span style="color: #000000; ">&nbsp;"You&nbsp;should&nbsp;use&nbsp;GCC&nbsp;or&nbsp;VC"</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;Count,&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;Show,&nbsp;typename&nbsp;T,&nbsp;typename&nbsp;Iterator_tag</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test(T&nbsp;beg,&nbsp;T&nbsp;mid,&nbsp;T&nbsp;end,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;Iterator_tag</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;iterator_tag,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">str&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">""</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsigned&nbsp;sum&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(unsigned&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;Count;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)&nbsp;{<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;ta&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;clock();<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ROTATE(beg,&nbsp;mid,&nbsp;end,&nbsp;iterator_tag);<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ta&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;clock()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;ta;<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;ta;<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(Show)&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;&nbsp;%u&nbsp;ms\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;str,&nbsp;ta);<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(Show)&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">aveg:&nbsp;%u&nbsp;ms\n\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;sum&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;Count);<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;%s&nbsp;&nbsp;total:&nbsp;%u&nbsp;ms\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;str,&nbsp;sum);<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;Count,&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;is_std,&nbsp;typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test2(T&nbsp;beg,&nbsp;T&nbsp;mid,&nbsp;T&nbsp;end,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">str&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">""</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsigned&nbsp;sum&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(unsigned&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;Count;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)&nbsp;{<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;ta&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;clock();<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(is_std)&nbsp;std::rotate(beg,&nbsp;mid,&nbsp;end);<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::reverse(beg,&nbsp;mid);<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::reverse(mid,&nbsp;end);<br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::reverse(beg,&nbsp;end);<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ta&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;clock()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;ta;<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;ta;<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;&nbsp;%u&nbsp;ms\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;str,&nbsp;ta);<br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">aveg:&nbsp;%u&nbsp;ms\n\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;sum&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;Count);<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;Count,&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;Show,&nbsp;typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test3(T&nbsp;beg,&nbsp;T&nbsp;mid,&nbsp;T&nbsp;end)<br /></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;test</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Count,&nbsp;Show</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(beg,&nbsp;mid,&nbsp;end,&nbsp;std::forward_iterator_tag(),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">forward</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;test</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Count,&nbsp;Show</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(beg,&nbsp;mid,&nbsp;end,&nbsp;std::bidirectional_iterator_tag(),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bidirectional</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;test</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Count,&nbsp;Show</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(beg,&nbsp;mid,&nbsp;end,&nbsp;std::random_access_iterator_tag(),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">random</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br /></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;N&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;1e7;<br /></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;M&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1024</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">const&nbsp;int&nbsp;M&nbsp;=&nbsp;777;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;vec(N);<br /></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::iterator&nbsp;beg(vec.begin()),&nbsp;mid(beg&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;M),&nbsp;end(vec.end());<br /></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">------\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;test2</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(beg,&nbsp;mid,&nbsp;end,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;3_reverse</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;test2</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(beg,&nbsp;mid,&nbsp;end,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;std::rotate</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;<br /></span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;test3</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(beg,&nbsp;mid,&nbsp;end);<br /></span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;<br /></span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)&nbsp;{<br /></span><span style="color: #008080; ">77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\n%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;i);<br /></span><span style="color: #008080; ">78</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;test3</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(beg,&nbsp;beg&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;i,&nbsp;end);<br /></span><span style="color: #008080; ">79</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">80</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;<br /></span><span style="color: #008080; ">81</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">82</span>&nbsp;<span style="color: #000000; "></span></span></div><img src ="http://www.cppblog.com/flyinghearts/aggbug/147403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-05-27 21:04 <a href="http://www.cppblog.com/flyinghearts/archive/2011/05/27/147403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一道C++面试题的误区</title><link>http://www.cppblog.com/flyinghearts/archive/2011/05/05/145771.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Thu, 05 May 2011 12:54:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/05/05/145771.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/145771.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/05/05/145771.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/145771.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/145771.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 问题：寻找数组中的最小值和最大值。&nbsp;一道很简单的题目，一般有下面4种解法：1 遍历两次，每次分别找出最小值和最大值。2 只遍历一次，每次取出的元素先与已找到的最小值比较，再与已找到的最大值比较。3 每次取两个元素，将较小者与已找到的最小值比较，将较大者与已找到的最大值比较。4 分治：将数组划分成两半，分别找出两边的最小值、最大值，则最小值、最大值分别是两边最小值的...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2011/05/05/145771.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/145771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-05-05 20:54 <a href="http://www.cppblog.com/flyinghearts/archive/2011/05/05/145771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用二叉树来理解树状数组 </title><link>http://www.cppblog.com/flyinghearts/archive/2011/04/11/143989.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Mon, 11 Apr 2011 15:54:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/04/11/143989.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/143989.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/04/11/143989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/143989.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/143989.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 树状数组（Fenwick tree，又名binary indexed tree），是一种很实用的数据结构。它通过用节点i，记录数组下标在[ i &#8211;2^k + 1, i]这段区间的所有数的信息（其中，k为i的二进制表示中末尾0的个数，设lowbit(i) = 2^k），实现在O(lg n) 时间内对数组数据的查找和更新。树状数组的传统解释图，不能很直观的看出其所能进行的更新和查询操作...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2011/04/11/143989.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/143989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-04-11 23:54 <a href="http://www.cppblog.com/flyinghearts/archive/2011/04/11/143989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>点树的简单实现（极省空间）</title><link>http://www.cppblog.com/flyinghearts/archive/2011/04/01/143245.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Fri, 01 Apr 2011 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/04/01/143245.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/143245.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/04/01/143245.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/143245.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/143245.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;思路：&nbsp;&nbsp;&nbsp; 先画一棵完全二叉树， 为节省空间，采用数组来实现。对这棵二叉树，叶子用于存放数据，节点用于统计叶子信息。通过下面的三种方法，进一步节省空间：1&nbsp;&nbsp; 节点只记录左子树叶子信息，右子树叶子信息通过当前节点和父节点等节点的值计算得出。&nbsp;&nbsp;&nbsp;&nbsp; 因而需要指定一个点，当作根...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2011/04/01/143245.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/143245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2011-04-01 23:36 <a href="http://www.cppblog.com/flyinghearts/archive/2011/04/01/143245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>螺旋矩阵 </title><link>http://www.cppblog.com/flyinghearts/archive/2010/12/23/137331.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Thu, 23 Dec 2010 15:09:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/12/23/137331.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/137331.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/12/23/137331.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/137331.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/137331.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 问题1 按顺时针方向构建一个m * n的螺旋矩阵（或按顺时针方向螺旋访问一个m * n的矩阵）：2 在不构造螺旋矩阵的情况下，给定坐标i、j值求其对应的值f(i, j)。比如对11 * 7矩阵， f(6, 0) = 27 &nbsp;f(6, 1) = 52&nbsp;f(6, 3) = 76 &nbsp;f(6, 4) = 63&nbsp;&nbsp;构建螺旋矩阵对m...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2010/12/23/137331.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/137331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-12-23 23:09 <a href="http://www.cppblog.com/flyinghearts/archive/2010/12/23/137331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>25匹马取前5</title><link>http://www.cppblog.com/flyinghearts/archive/2010/12/03/135382.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Fri, 03 Dec 2010 12:51:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/12/03/135382.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/135382.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/12/03/135382.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/135382.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/135382.html</trackback:ping><description><![CDATA[<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><br>问题：</span><span lang=EN-US><span style="mso-spacerun: yes">&nbsp; </span><o:p></o:p></span></strong></p>
<p style="TEXT-INDENT: 21.1pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一共有</span><span lang=EN-US>25</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">匹马，有一个赛场，赛场有</span><span lang=EN-US>5</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个赛道，就是说最多同时可以有</span><span lang=EN-US>5</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">匹马一起比赛。假设每匹马都跑的很稳定，不用任何其他工具，只通过马与马之间的比赛，试问最少得比多少场才能知道跑得最快的</span><span lang=EN-US>5</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">匹马？</span><span lang=EN-US><o:p></o:p></span></strong></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">思路：</span></p>
<p style="TEXT-INDENT: 21.75pt; MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先将</span><span lang=EN-US>25</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">匹马分成五组，进行五场比赛。第六场比赛可以考虑都取各个小组的第一名（或第二名）。假设都取各小组的第一名，根据这场比赛的排名，将原来的小组分别编号为</span><span lang=EN-US>a</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>b</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>c</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>d</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>e</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，并将原来的</span><span lang=EN-US>25</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">匹马分别编号为：</span></p>
<p style="TEXT-INDENT: 21.75pt; MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US>a1<span style="mso-spacerun: yes">&nbsp; </span>b1<span style="mso-spacerun: yes">&nbsp; </span>c1<span style="mso-spacerun: yes">&nbsp; </span>d1<span style="mso-spacerun: yes">&nbsp; </span>e1</span></p>
<p style="TEXT-INDENT: 21.75pt; MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US>a2<span style="mso-spacerun: yes">&nbsp; </span>b2<span style="mso-spacerun: yes">&nbsp; </span>c2<span style="mso-spacerun: yes">&nbsp; </span>d2<span style="mso-spacerun: yes">&nbsp; </span>e2</span></p>
<p style="TEXT-INDENT: 21.75pt; MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US>a3<span style="mso-spacerun: yes">&nbsp; </span>b3<span style="mso-spacerun: yes">&nbsp; </span>c3<span style="mso-spacerun: yes">&nbsp; </span>d3<span style="mso-spacerun: yes">&nbsp; </span>e3</span></p>
<p style="TEXT-INDENT: 21.75pt; MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US>a4<span style="mso-spacerun: yes">&nbsp; </span>b4<span style="mso-spacerun: yes">&nbsp; </span>c4<span style="mso-spacerun: yes">&nbsp; </span>d4<span style="mso-spacerun: yes">&nbsp; </span>e4</span></p>
<p style="TEXT-INDENT: 21.75pt; MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US>a5<span style="mso-spacerun: yes">&nbsp; </span>b5<span style="mso-spacerun: yes">&nbsp; </span>c5<span style="mso-spacerun: yes">&nbsp; </span>d5<span style="mso-spacerun: yes">&nbsp; </span>e5</span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中</span><span lang=EN-US>Xi</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US>X</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示组的编号，</span><span lang=EN-US>i</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为在该组的排名，则有：<br></span><span lang=EN-US>&nbsp;a1 &gt; b1 &gt; c1 &gt; d1 &gt; e1<br>&nbsp;</span>a1 &gt; a2 &gt; a3 &gt; a4 &gt; a5<br><span lang=EN-US><o:p>&nbsp;b1 &gt; b2 &gt; b3 &gt; b4 &gt; b5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .......<br>&nbsp;e1 &gt; e2 &gt; e3 &gt; e4 &gt; e5<br>&nbsp;&nbsp;<br></o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span>注意到：<strong>跑得比</strong></span><strong><span>a3</span><span>、</span><span>b2</span><span>、</span><span>c1</span><span>这三匹马都快的只可能是</span><span>a1</span><span>、</span><span>a2</span><span>、</span><span>b1</span><span>，因而</span><span>a3</span><span>、</span><span>b2</span><span>、</span><span>c1</span><span>三匹马中跑得最快的必然是前四之一</span></strong><span>。</span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此，第七场比赛，这三匹马必然参加，剩下两个名额待定。先考虑这三匹马的排名：</span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US>(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面用</span><span lang=EN-US>[]</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集合表示已确定是前五的马，用</span><span lang=EN-US>{}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集合表示剩下的马中所有有可能是前五的马。</span><span lang=EN-US>)</span></p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">①</span><span lang=EN-US><span style="mso-spacerun: yes">&nbsp; </span>a3 b2 c1 </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span><span lang=EN-US> a3 c1 b2:<span style="mso-spacerun: yes">&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则</span> <span lang=EN-US>[a1, a2, a3] <span style="mso-spacerun: yes">&nbsp;</span>+<span style="mso-spacerun: yes">&nbsp; </span>{a4,a5,b1,b2,c1}</span></p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">②</span><span lang=EN-US><span style="mso-spacerun: yes">&nbsp; </span>b2 a3 c1:<span style="mso-spacerun: yes">&nbsp; </span>[a1,b1,b2] <span style="mso-spacerun: yes">&nbsp;</span>+ <span style="mso-spacerun: yes">&nbsp;</span>{ a2,a3, b3,b4}</span></p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">③</span><span lang=EN-US><span style="mso-spacerun: yes">&nbsp; </span>b2 c1 a3:<span style="mso-spacerun: yes">&nbsp; </span>[a1,b1,b2]<span style="mso-spacerun: yes">&nbsp; </span>+<span style="mso-spacerun: yes">&nbsp; </span>{a2,b3,b4,c1,c2,d1}</span></p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">④</span><span lang=EN-US><span style="mso-spacerun: yes">&nbsp; </span>c1 a3 b2:<span style="mso-spacerun: yes">&nbsp; </span>[a1,b1,c1]<span style="mso-spacerun: yes">&nbsp; </span>+<span style="mso-spacerun: yes">&nbsp; </span>{a2,c2,c3,d1,d2,e1 }</span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了能在第八场确定前五，必须将上面的</span><span lang=EN-US>{a2,b3,b4,c1,c2,d1} </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US>{a2,c2,c3,d1,d2,e1} </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的候选马匹数减少到五匹，因而剩下的两个名额必须是这两个集合的重复元素，即是</span><span lang=EN-US>{a2, c2, d1}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的两个。由于</span><span lang=EN-US>a2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">跑得比</span><span lang=EN-US>a3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">快，若选择</span><span lang=EN-US>a2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的话，不能利用前面的分析，因而剩下两匹马选择</span><span lang=EN-US> c2 </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US> d1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第七场比赛：</span><span lang=EN-US>a3</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>b2</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>c1</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>c2</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>d1 </span></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的前两名是</span><span lang=EN-US>:</span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">①</span> <span lang=EN-US>a3<span style="mso-spacerun: yes">&nbsp;&nbsp; </span>: <span style="mso-spacerun: yes">&nbsp;</span>[a1, a2, a3]<span style="mso-spacerun: yes">&nbsp; </span>+<span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span>{a4, a5, b1, b2, c1}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的前二名（由第八场比赛决定）</span></p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">②</span> <span lang=EN-US>b2 a3: <span style="mso-spacerun: yes">&nbsp;</span>[a1, b1, b2]<span style="mso-spacerun: yes">&nbsp; </span>+<span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span>{a2,a3, b3,b4}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的前二名</span></p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">③</span> <span lang=EN-US>b2 c1:<span style="mso-spacerun: yes">&nbsp; </span>[a1, b1, b2]<span style="mso-spacerun: yes">&nbsp; </span>+<span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span>{a2, b3, b4, c1, max(c2, d1)} </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的前二名</span></p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">④</span> <span lang=EN-US>c1 a3:<span style="mso-spacerun: yes">&nbsp; </span>[a1,a2,a3,b1,c1] <span style="mso-spacerun: yes">&nbsp;</span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（第七场就可确定前五）</span> </p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">⑤</span> <span lang=EN-US>c1 b2:<span style="mso-spacerun: yes">&nbsp; </span>[a1,b1,c1]<span style="mso-spacerun: yes">&nbsp; </span>+<span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span><span style="mso-spacerun: yes">&nbsp;</span>{a2,b2,b3,c2,d1}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的前二名</span></p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">⑥</span> <span lang=EN-US>c1 c2:<span style="mso-spacerun: yes">&nbsp; </span>[a1,b1,c1,c2]<span style="mso-spacerun: yes">&nbsp; </span>+<span style="mso-spacerun: yes">&nbsp; </span>{a2,b2,c3,d1}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的第一名</span></p>
<p style="TEXT-INDENT: 10.5pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">⑦</span> <span lang=EN-US>c1 d1:<span style="mso-spacerun: yes">&nbsp; </span>[a1,b1,c1,d1]<span style="mso-spacerun: yes">&nbsp; </span>+<span style="mso-spacerun: yes">&nbsp; </span>{a2,b2,c2,d2,e1}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的第一名</span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因而，<strong style="mso-bidi-font-weight: normal">最少七场比赛，最多八场比赛</strong>就可确定跑得最快的</span><span lang=EN-US>5</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">匹马。</span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/flyinghearts/aggbug/135382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-12-03 20:51 <a href="http://www.cppblog.com/flyinghearts/archive/2010/12/03/135382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面试题： 找出二叉树上任意两个结点的最近共同父结点。</title><link>http://www.cppblog.com/flyinghearts/archive/2010/12/02/135314.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Thu, 02 Dec 2010 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/12/02/135314.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/135314.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/12/02/135314.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/135314.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/135314.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><br><font style="BACKGROUND-COLOR: #c0c0c0" face="Times New Roman">&nbsp;&nbsp;&nbsp; </font>实际上，用树的后序遍历就可以了。当访问到所求的节点<span lang=EN-US>A</span>时，如果这两个节点不在一条线上，则它们必定分别在<span lang=EN-US>A</span>的左子树和右子树上，后序遍历到第一个满足这个条件的节点就是所要求的节点<span lang=EN-US>A</span>。另外，还必须对这两个节点在一条线上的情况，做特殊处理。<br><br>代码：<br><span lang=EN-US><o:p></o:p></span></span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt" lang=EN-US><o:p></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;lca(Node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">root,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;va,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;vb,&nbsp;Node&nbsp;</span><span style="COLOR: #000000">*&amp;</span><span style="COLOR: #000000">result,&nbsp;Node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;parrent)<br><img id=Codehighlighter1_74_532_Open_Image onclick="this.style.display='none'; Codehighlighter1_74_532_Open_Text.style.display='none'; Codehighlighter1_74_532_Closed_Image.style.display='inline'; Codehighlighter1_74_532_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_74_532_Closed_Image onclick="this.style.display='none'; Codehighlighter1_74_532_Closed_Text.style.display='none'; Codehighlighter1_74_532_Open_Image.style.display='inline'; Codehighlighter1_74_532_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_74_532_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_74_532_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;left/right&nbsp;左/右子树是否含有要判断的两节点之一&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;left&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">,&nbsp;right&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">result&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">left)&nbsp;left&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;lca(root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">left,va,vb,result,root);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">result&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">right)&nbsp;right&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;lca(root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">right,va,vb,result,root);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;mid&nbsp;当前节点是否是要判断的两节点之一&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;mid&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">data&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;va&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">data&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;vb)&nbsp;mid</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_441_500_Open_Image onclick="this.style.display='none'; Codehighlighter1_441_500_Open_Text.style.display='none'; Codehighlighter1_441_500_Closed_Image.style.display='inline'; Codehighlighter1_441_500_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_441_500_Closed_Image onclick="this.style.display='none'; Codehighlighter1_441_500_Closed_Text.style.display='none'; Codehighlighter1_441_500_Open_Image.style.display='inline'; Codehighlighter1_441_500_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">result&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">(left&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;right&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;mid)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_441_500_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_441_500_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(mid)&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;parrent;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;root;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;left&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;mid&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;right&nbsp;;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">lca(Node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">root,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;va,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;vb)<br><img id=Codehighlighter1_572_681_Open_Image onclick="this.style.display='none'; Codehighlighter1_572_681_Open_Text.style.display='none'; Codehighlighter1_572_681_Closed_Image.style.display='inline'; Codehighlighter1_572_681_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_572_681_Closed_Image onclick="this.style.display='none'; Codehighlighter1_572_681_Closed_Text.style.display='none'; Codehighlighter1_572_681_Open_Image.style.display='inline'; Codehighlighter1_572_681_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_572_681_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_572_681_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(root&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;NULL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;Node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;lca(root,&nbsp;va,&nbsp;vb,result,&nbsp;NULL);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;result;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span></div>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal>&nbsp;</o:p></span></p>
<p><font style="BACKGROUND-COLOR: #c0c0c0"></font>&nbsp;</p>
<img src ="http://www.cppblog.com/flyinghearts/aggbug/135314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-12-02 23:36 <a href="http://www.cppblog.com/flyinghearts/archive/2010/12/02/135314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多重背包O(N*V)算法详解（使用单调队列）</title><link>http://www.cppblog.com/flyinghearts/archive/2010/09/01/125555.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Wed, 01 Sep 2010 15:25:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/09/01/125555.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/125555.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/09/01/125555.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/125555.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/125555.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 多重背包O(N*V)算法详解（使用单调队列） &nbsp;多重背包问题：有N种物品和容量为V的背包，若第i种物品，容量为v[i]，价值为w[i]，共有n[i]件。怎样装才能使背包内的物品总价值最大？&nbsp;网上关于&#8220;多重背包&#8221;的资料倒是不少，但是关于怎么实现O(N*V)算法的资料，真得好少呀，关于&#8220;单调队列&#8221;那部分算法，又没说...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2010/09/01/125555.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/125555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-09-01 23:25 <a href="http://www.cppblog.com/flyinghearts/archive/2010/09/01/125555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《编程之美》读书笔记03： 1.4 买书问题</title><link>http://www.cppblog.com/flyinghearts/archive/2010/08/15/123534.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 15 Aug 2010 15:48:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/08/15/123534.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/123534.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/08/15/123534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/123534.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/123534.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 《编程之美》读书笔记03： 1.4 买书问题&nbsp;问题：&nbsp;&nbsp;&nbsp; 在节假日的时候，书店一般都会做促销活动。由于《哈利波特》系列相当畅销，店长决定通过促销活动来回馈读者。在销售的《哈利波特》平装本系列中，一共有五卷，用编号0, 1, 2, 3, 4来表示。假设每一卷单独销售均需要8欧元。如果读者一次购买不同的两卷，就可以扣除5%的费用，三卷则更多。假设具...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2010/08/15/123534.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/123534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-08-15 23:48 <a href="http://www.cppblog.com/flyinghearts/archive/2010/08/15/123534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《编程之美》读书笔记22：    1.16  24点游戏（补充）</title><link>http://www.cppblog.com/flyinghearts/archive/2010/08/15/123531.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 15 Aug 2010 15:35:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/08/15/123531.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/123531.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/08/15/123531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/123531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/123531.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 《编程之美》读书笔记22：&nbsp;&nbsp;&nbsp; 1.16&nbsp; 24点游戏（补充）&nbsp;给定n个数，能否只通过加减乘除计算得到24？ 书上给出的最后一种解法，通过使用集合记录中间结果来减少冗余计算。本以为，程序会占用大量的内存，用一个极端的例子（13, 773, 28, 98, 731, 1357,97357246这7个数）测试了一下实现的程序，发现程序竟然...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2010/08/15/123531.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/123531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-08-15 23:35 <a href="http://www.cppblog.com/flyinghearts/archive/2010/08/15/123531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>N个数计算24点</title><link>http://www.cppblog.com/flyinghearts/archive/2010/08/15/123529.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 15 Aug 2010 15:20:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/08/15/123529.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/123529.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/08/15/123529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/123529.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/123529.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: N个数计算24点问题：&nbsp;&nbsp;&nbsp; N个1到13之间的自然数，找出所有能通过加减乘除计算（每个数有且只能用一次）得到24的组合？&nbsp;计算24点常用的算法有：① 任取两个数，计算后，将结果放回去，再从剩下的数中任取两个，如此反复直到只剩下一个数；② 先构建前缀/后缀表达式，再计算该表达式；③ 用集合保存中间结果，集合间两两进行合并计算得到新集合（或者对...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2010/08/15/123529.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/123529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-08-15 23:20 <a href="http://www.cppblog.com/flyinghearts/archive/2010/08/15/123529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《编程之美》读书笔记21： 2.4  1的数目</title><link>http://www.cppblog.com/flyinghearts/archive/2010/07/21/120915.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 20 Jul 2010 16:25:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/07/21/120915.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/120915.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/07/21/120915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/120915.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/120915.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;《编程之美》读书笔记21： 2.4 1的数目&nbsp;问题：&nbsp;&nbsp;&nbsp; 给定一个十进制正整数N，写下从1开始，到N的所有整数，&nbsp;&nbsp;&nbsp; 然后数一下其中出现的所有&#8220;1&#8221;的个数。 &nbsp; &nbsp;&nbsp;例如： &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2010/07/21/120915.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/120915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-07-21 00:25 <a href="http://www.cppblog.com/flyinghearts/archive/2010/07/21/120915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《编程之美》读书笔记08：2.9 Fibonacci序列 —— O(log n)求Fibonacci数列（非矩阵法）</title><link>http://www.cppblog.com/flyinghearts/archive/2010/06/23/118593.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Wed, 23 Jun 2010 15:28:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/06/23/118593.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/118593.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/06/23/118593.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/118593.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/118593.html</trackback:ping><description><![CDATA[<p style="TEXT-ALIGN: left" class=MsoNormal align=left>《编程之美》读书笔记08：2.9 Fibonacci序列 <br><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black"></p>
<p style="TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体; mso-highlight: white" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体; mso-highlight: white">计算</span><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体" lang=EN-US>Fibonacci</span><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体">序列最直接的方法就是利用递推公式<span lang=EN-US> F(n+2)=F(n+1)+F(n)</span>。而用通项公式来求解是错误的，用浮点数表示无理数本来就有误差，经过<span lang=EN-US>n</span>次方后，当<span lang=EN-US>n</span>相当大时，误差能足够大到影响浮点数转为整数时的精度，得到的结果根本不准。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体">用矩阵来计算，虽然时间复杂度降到<span lang=EN-US>O(log n)</span>，但要用到矩阵类，相当麻烦。观察：<span style="BACKGROUND: white; mso-highlight: white" lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 31.4pt; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none; mso-char-indent-count: 2.98" class=MsoNormal align=left><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体" lang=EN-US>F(n+2)=F(n)+F(n-1)</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体">＝<span lang=EN-US>2*F(n-1)+F(n-2)=3*F(n-2)+2*F(n-4)<o:p></o:p></span></span></strong></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体">用归纳法很容易证明 </span><span style="FONT-FAMILY: 宋体; COLOR: blue; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体" lang=EN-US>F(n) = F(k)*F(n+1-k) + F(k-1)*F(n-k)</span><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体">，利用该递推公式和原递推公式，要计算<span lang=EN-US>F(n)</span>，只要计算<span lang=EN-US>F([n/2])</span>和<span lang=EN-US>F([n/2]+1)</span>，时间复杂度为<span lang=EN-US> O(lg n)</span>。<em style="mso-bidi-font-style: normal"><span style="BACKGROUND: white; mso-highlight: white">如：要计算<span lang=EN-US>F(58)</span>，由 <span lang=EN-US>58 -&gt; 29,30 -&gt; 14,15 -&gt; 7,8 -&gt; 3,4 -&gt; 1,2 </span>可知只要算<span lang=EN-US>5</span>次。</span></em><span style="BACKGROUND: white; mso-highlight: white">可以用一个栈保存要计算的数，实际上，将<span lang=EN-US>n</span>的最高位<span lang=EN-US>1</span>（假设在第<span lang=EN-US>k</span>位）左边的<span lang=EN-US>0</span>去除掉后，第<span lang=EN-US>m</span>次要计算的数是第<span lang=EN-US>k</span>位到第<span lang=EN-US>k-m+1</span>位这<span lang=EN-US>m</span>个位组成的值<span lang=EN-US>t(m)</span>，则第<span lang=EN-US>m-1</span>次要计算的数为<span lang=EN-US>t(m-1)</span>，且<span lang=EN-US><o:p></o:p></span></span></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体; mso-highlight: white" lang=EN-US>t(m)=2*t(m-1)+(</span><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体; mso-highlight: white">第<span lang=EN-US>k-m+1</span>位是否为<span lang=EN-US>1)</span>。</span><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">若第<span lang=EN-US>m-1</span>次计算得到了<span lang=EN-US>f(k)</span>和<span lang=EN-US>f(k+1)</span>，则第<span lang=EN-US>m</span>次计算：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-ALIGN: left" class=MsoNormal align=left>
<table style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; MARGIN: auto auto auto 116.05pt; BORDER-COLLAPSE: collapse; BORDER-TOP: medium none; BORDER-RIGHT: medium none; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" class=MsoTableGrid border=1 cellSpacing=0 cellPadding=0>
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm; mso-border-alt: solid windowtext .5pt" vAlign=top>
            <p style="TEXT-ALIGN: center; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=center><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">第<span lang=EN-US>k-m+1</span>位<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #ffffff; PADDING-BOTTOM: 0cm; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top>
            <p style="TEXT-ALIGN: center; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=center><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">已计算<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #ffffff; PADDING-BOTTOM: 0cm; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top>
            <p style="TEXT-ALIGN: center; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=center><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">待计算<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 1">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top>
            <p style="TEXT-ALIGN: center; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=center><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang=EN-US>1<o:p></o:p></span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #ffffff; PADDING-BOTTOM: 0cm; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top rowSpan=2>
            <p style="TEXT-ALIGN: center; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=center><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang=EN-US>f(k)<o:p></o:p></span></p>
            <p style="TEXT-ALIGN: center; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=center><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang=EN-US>f(k+1)<o:p></o:p></span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #ffffff; PADDING-BOTTOM: 0cm; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top>
            <p style="TEXT-ALIGN: center; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=center><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang=EN-US>f(2*k+1),f(2*k+2)<o:p></o:p></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 2; mso-yfti-lastrow: yes">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top>
            <p style="TEXT-ALIGN: center; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=center><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang=EN-US>0<o:p></o:p></span></p>
            </td>
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: #ffffff; PADDING-BOTTOM: 0cm; BACKGROUND-COLOR: transparent; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top>
            <p style="TEXT-ALIGN: center; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=center><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang=EN-US>f(2*k),f(2*k+1)<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 24pt; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">具体公式见下面代码。</span><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 24pt; MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 新宋体; mso-highlight: white">下面是计算<span lang=EN-US>F(n)</span>最后四位数（某道<span lang=EN-US>ACM</span>题）的代码。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left" class=MsoNormal align=left><br></span>&nbsp;</p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 24pt" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black"></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;Fibonacci数列第N个数的最后4位数<br>&nbsp;&nbsp;&nbsp;&nbsp;注意，当&nbsp;N&gt;93&nbsp;时&nbsp;第N个数的值超过64位无符号整数可表示的范围。<br>F(n+2)=F(n)+F(n-1)&nbsp;F(0)=0&nbsp;F(1)=1&nbsp;&nbsp;F(2)=1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;==&gt;<br>F(n)=F(k)*F(n+1-k)&nbsp;+&nbsp;F(k-1)*F(n-k)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;==&gt;<br>F(2*n)=F(n+1)*F(n)+F(n)*F(n-1)=(F(n+1)+F(n-1))*F(n)=(F(n+1)*2-F(n))*F(n)<br>F(2*n+1)=F(n+1)*F(n+1)+F(n)*F(n)<br>F(2*n+2)=F(n+2)*F(n+1)+F(n+1)*F(n)=(F(n+2)+F(n))*F(n+1)=(F(n+1)+F(n)*2)*F(n+1)<br>&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br><br>unsigned&nbsp;fib_last4(&nbsp;unsigned&nbsp;num)<br>{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;num&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;unsigned&nbsp;M</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">10000</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;unsigned&nbsp;ret</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,next</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,ret_</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ret;<br>&nbsp;&nbsp;unsigned&nbsp;flag</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;tt</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">num;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(&nbsp;tt&nbsp;</span><span style="COLOR: #000000">&gt;&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;flag&nbsp;</span><span style="COLOR: #000000">&lt;&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(&nbsp;flag&nbsp;</span><span style="COLOR: #000000">&gt;&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;num&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;flag&nbsp;){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret_&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ret&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ret&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;next&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(ret&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ret&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;next)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">多加一个M，避免&nbsp;2*next-ret是负数，造成结果不对</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret_&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(next&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;next&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;M&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;ret)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ret;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ret&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ret&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;next&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ret_&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;M;<br>&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;next&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;M;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;ret;<br>}<br><br></span></div>
<br></span>
<p>&nbsp;</p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 24pt" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; BACKGROUND: white; COLOR: black"><br></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 24pt" class=MsoNormal align=left><br></p>
<img src ="http://www.cppblog.com/flyinghearts/aggbug/118593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-06-23 23:28 <a href="http://www.cppblog.com/flyinghearts/archive/2010/06/23/118593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Trilogy公司的笔试题:根据指定规则用最少的步骤将数转为1</title><link>http://www.cppblog.com/flyinghearts/archive/2010/06/21/118350.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Mon, 21 Jun 2010 04:46:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2010/06/21/118350.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/118350.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2010/06/21/118350.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/118350.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/118350.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;Trilogy</span><span style="font-family: 宋体; font-size: 12pt;">公司的笔试题<span lang="EN-US">:<br></span></span><br><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; color: #0000ff; font-size: 12pt;">如果<span lang="EN-US">n</span>为偶数，则将它除以<span lang="EN-US">2</span>，如果<span lang="EN-US">n</span>为奇数，则将它加<span lang="EN-US">1</span>或者减<span lang="EN-US">1</span>。问对于一个给定的<span lang="EN-US">n</span>，怎样才能用最少的步骤将它变到<span lang="EN-US">1</span>。<br>&nbsp;&nbsp;&nbsp; 例如：n=11： ①　++n -&gt; 12　② n/2 -&gt; 6 ③ n/2 -&gt; 3&nbsp;&nbsp; ④ --n -&gt; 2&nbsp; ⑤ n/2 -&gt; 1&nbsp; 共需5步。</span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; color: #0000ff; font-size: 12pt;">&nbsp;<br>&nbsp;</span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">最简单的方法就是用<span lang="EN-US">DP</span>。设<span lang="EN-US">f(n)</span>为所用的最少步骤。根据定义可得：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 36pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">若<span lang="EN-US">n</span>为偶数，<span lang="EN-US"> f(n)=f(n/2) + 1;<o:p></o:p></span></span></p>
<p style="text-indent: 36pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">若<span lang="EN-US">n</span>为奇数，<span lang="EN-US"> f(n)= min(f(n-1), f(n+1)) +1<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span>= min(f((n-1)/2), f((n+1)/2)) +2<o:p></o:p></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">或者：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 36pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;</span>f(2*k)=f(k)+1<span>&nbsp; </span><o:p></o:p></span></p>
<p style="text-indent: 42pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">f(2*k+1)=min(f(k),f(k+1))+2<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">利用上述递推公式，可以直接从数字<span lang="EN-US">1</span>开始算到<span lang="EN-US">n</span>，用一个数组保存前<span lang="EN-US"> n/2+1</span>个数所用的最少步骤，但这时间和空间复杂度均为<span lang="EN-US">O(n)</span>，其实利用上面的递推公式，可以实现时间复杂度为<span lang="EN-US">0(lg n)</span>。观察上面的递推公式，可以发现，要计算<span lang="EN-US">n</span>，只要计算<span lang="EN-US">n/2</span>和<span lang="EN-US">n/2+1</span>，如要计算<span lang="EN-US">59</span>，只要计算：<span lang="EN-US"> <br></span></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;"><span lang="EN-US">59 -&gt; 29,30 -&gt; 14,15 -&gt; 7,8 -&gt; 3,4 -&gt; 1,2</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p><br></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">代码如下：<br><br></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;num2one_dp(unsigned&nbsp;n)<br><img id="Codehighlighter1_27_304_Open_Image" onclick="this.style.display='none'; codehighlighter1_27_304_open_text.style.display="'none';" codehighlighter1_27_304_closed_image.style.display="'inline';" codehighlighter1_27_304_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_27_304_Closed_Image" onclick="this.style.display='none'; codehighlighter1_27_304_closed_text.style.display="'none';" codehighlighter1_27_304_open_image.style.display="'inline';" codehighlighter1_27_304_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_27_304_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_27_304_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;unsigned&nbsp;tmp</span><span style="color: #000000;">=</span><span style="color: #000000;">n,&nbsp;flag</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;ret</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;next</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(tmp</span><span style="color: #000000;">&gt;&gt;=</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;flag</span><span style="color: #000000;">&lt;&lt;=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img id="Codehighlighter1_117_288_Open_Image" onclick="this.style.display='none'; codehighlighter1_117_288_open_text.style.display="'none';" codehighlighter1_117_288_closed_image.style.display="'inline';" codehighlighter1_117_288_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_117_288_Closed_Image" onclick="this.style.display='none'; codehighlighter1_117_288_closed_text.style.display="'none';" codehighlighter1_117_288_open_image.style.display="'inline';" codehighlighter1_117_288_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(flag</span><span style="color: #000000;">&gt;&gt;=</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_117_288_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_117_288_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_137_207_Open_Image" onclick="this.style.display='none'; codehighlighter1_137_207_open_text.style.display="'none';" codehighlighter1_137_207_closed_image.style.display="'inline';" codehighlighter1_137_207_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_137_207_Closed_Image" onclick="this.style.display='none'; codehighlighter1_137_207_closed_text.style.display="'none';" codehighlighter1_137_207_open_image.style.display="'inline';" codehighlighter1_137_207_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;flag)&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_137_207_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_137_207_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(ret&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;next)&nbsp;ret&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;next;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">next;<br><img id="Codehighlighter1_214_284_Open_Image" onclick="this.style.display='none'; codehighlighter1_214_284_open_text.style.display="'none';" codehighlighter1_214_284_closed_image.style.display="'inline';" codehighlighter1_214_284_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_214_284_Closed_Image" onclick="this.style.display='none'; codehighlighter1_214_284_closed_text.style.display="'none';" codehighlighter1_214_284_open_image.style.display="'inline';" codehighlighter1_214_284_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_214_284_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_214_284_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(next&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;ret)&nbsp;next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ret;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">ret;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ret;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<p class="MsoNormal"><br><span style="font-family: 宋体; font-size: 12pt;">上面的<span lang="EN-US">O(lg n)</span>解法，对<span lang="EN-US">n</span>先处理高位的<span lang="EN-US">0</span>和<span lang="EN-US">1</span>，下面的<span lang="EN-US">O(lg n)</span>解法则恰恰相反，先处理<span lang="EN-US">n</span>的低位的<span lang="EN-US">0</span>和<span lang="EN-US">1</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">将<span lang="EN-US">n</span>（<span lang="EN-US">n&gt;1</span>）转为二进制数表示<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">（下面的&#8220;加<span lang="EN-US">1</span>&#8221;、&#8220;减<span lang="EN-US">1</span>&#8221;操作均特指对奇数采取的操作，操作次数包括对偶数的操作次数。）<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">⑴ 如果<span lang="EN-US">n</span>仅由<span lang="EN-US">m</span>个连续的<span lang="EN-US">1</span>组成（即<span lang="EN-US">n=2^m-1</span>，<span lang="EN-US"> m&gt;=2</span>），<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 42pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">① &#8220;加<span lang="EN-US">1</span>&#8221;操作：<span lang="EN-US"><span>&nbsp; </span></span>需要<span lang="EN-US"> m+1 </span>次操作<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 42pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">② &#8220;减<span lang="EN-US">1</span>&#8221;操作：<span lang="EN-US"><span>&nbsp; </span></span>需要<span lang="EN-US"> 2*(m-1) </span>次操作<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 12pt;">显然，仅当<span lang="EN-US">m=2</span>（即<span lang="EN-US">n=3</span>）时，&#8220;减<span lang="EN-US">1&#8221;</span>所用的操作次数才比<span lang="EN-US">&#8220;</span>加<span lang="EN-US">1&#8221;</span>少。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">⑵ 如果<span lang="EN-US">n</span>可以表示为：<span lang="EN-US">x10<sub>m</sub>1<sub>k</sub> </span>（<span lang="EN-US">m&gt;=1, k&gt;=1</span>）<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 42pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">（<span lang="EN-US">x</span>可以为空串或任意<span lang="EN-US">01</span>序列，<span lang="EN-US">0<sub>m</sub></span>表示连续<span lang="EN-US">m</span>个<span lang="EN-US">0</span>，<span lang="EN-US">1<sub>k</sub></span>表示连续<span lang="EN-US">k</span>个<span lang="EN-US">1)<o:p></o:p></span></span></p>
<p style="text-indent: -36pt; margin-left: 59.95pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;</span><span>&nbsp; </span></span><span style="font-family: 宋体; font-size: 12pt;">① &#8220;加<span lang="EN-US">1</span>&#8221;操作：<span lang="EN-US"><span>&nbsp; </span>k+1 </span>次操作后得到<span lang="EN-US">x10<sub>m-1</sub>1</span>如果，接着用&#8220;减<span lang="EN-US">1</span>&#8221;操作（注意，这不这一定最优解法），总共<span lang="EN-US">k+3</span>次操作可得<span lang="EN-US">x10<sub>m-1</sub></span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;</span><span>&nbsp; </span></span><span style="font-family: 宋体; font-size: 12pt;">②&#8220;减<span lang="EN-US">1</span>&#8221;操作：<span lang="EN-US"><span>&nbsp; </span>2*k+1</span>次操作后得到<span lang="EN-US">x10<sub>m-1</sub><o:p></o:p></span></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp; </span><span>&nbsp;</span></span><span style="font-family: 宋体; font-size: 12pt;">显然，仅当<span lang="EN-US">k=1</span>时，&#8220;减<span lang="EN-US">1&#8221;</span>所用的操作次数才可能比<span lang="EN-US">&#8220;</span>加<span lang="EN-US">1&#8221;</span>少。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 12pt;">可以证明，对<span lang="EN-US">x10<sub>m</sub>1</span>，&#8220;减<span lang="EN-US">1&#8221;</span>所用的操作次数一定不会比&#8220;加<span lang="EN-US">1</span>&#8221;的多。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -42pt; margin-left: 65.95pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 12pt;">（当<span lang="EN-US">k=1</span>时，对<span lang="EN-US">x10<sub>m</sub>1</span>，假设先进行一次&#8220;加<span lang="EN-US">1</span>&#8221;操作最终所用的步骤数较少。&#8220;加<span lang="EN-US">1</span>&#8221;操作后，在将<span lang="EN-US">x10<sub>m</sub>1</span>转为<span lang="EN-US">x11</span>前，若用到&#8220;减<span lang="EN-US">1</span>&#8221;操作，则可以直接对<span lang="EN-US">x10<sub>m</sub>1</span>进行 &#8220;减<span lang="EN-US">1</span>&#8221;操作，所有步骤更少，因而后面都是采用&#8220;加<span lang="EN-US">1</span>&#8221;操作。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span></span><span style="font-family: 宋体; font-size: 12pt;">对<span lang="EN-US">x10<sub>m</sub>1</span>（可表示为<span lang="EN-US">y01<sub>t</sub>0<sub>m</sub>1</span>，<span lang="EN-US">y</span>允许是空串）， <span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 48pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">　&#8220;加<span lang="EN-US">1</span>&#8221;操作<span lang="EN-US"><span>&nbsp;&nbsp; </span>2*m+t+2 </span>次后得到 <span>&nbsp;</span><span lang="EN-US">y1 <o:p></o:p></span></span></p>
<p style="text-indent: 60pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">&#8220;减<span lang="EN-US">1</span>&#8221;操作<span lang="EN-US"><span>&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>m+2 </span>次后得到<span lang="EN-US"><span>&nbsp; </span>y01<sub>t <o:p></o:p></sub></span></span></p>
<p style="text-indent: 72pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">（再用&#8220;加<span lang="EN-US">1</span>操作&#8221;，<span lang="EN-US">m+t+3</span>后也可得到<span lang="EN-US">y1</span>）<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 54pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">由于对<span lang="EN-US">m&gt;=1</span>，恒有<span lang="EN-US">m+t+3 &lt;= 2*m+t+2</span>，因而对<span lang="EN-US">x10<sub>m</sub>1 <o:p></o:p></span></span></p>
<p style="text-indent: 54pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">&#8220;减<span lang="EN-US">1</span>&#8221;操作能保证得到最优解。）<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 24pt;" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">⑶ 总之，仅当<span lang="EN-US">n=3</span>或<span lang="EN-US">n</span>二进制表示的最低<span lang="EN-US">2</span>位是<span lang="EN-US">01</span>时，才用&#8220;减<span lang="EN-US">1&#8221;</span>操作</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;"><br></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;">代码：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;num2one(unsigned&nbsp;n)<br><img id="Codehighlighter1_24_281_Open_Image" onclick="this.style.display='none'; codehighlighter1_24_281_open_text.style.display="'none';" codehighlighter1_24_281_closed_image.style.display="'inline';" codehighlighter1_24_281_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_24_281_Closed_Image" onclick="this.style.display='none'; codehighlighter1_24_281_closed_text.style.display="'none';" codehighlighter1_24_281_open_image.style.display="'inline';" codehighlighter1_24_281_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_24_281_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_24_281_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n</span><span style="color: #000000;">==</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;count</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img id="Codehighlighter1_76_263_Open_Image" onclick="this.style.display='none'; codehighlighter1_76_263_open_text.style.display="'none';" codehighlighter1_76_263_closed_image.style.display="'inline';" codehighlighter1_76_263_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_76_263_Closed_Image" onclick="this.style.display='none'; codehighlighter1_76_263_closed_text.style.display="'none';" codehighlighter1_76_263_open_image.style.display="'inline';" codehighlighter1_76_263_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_76_263_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_76_263_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_99_120_Open_Image" onclick="this.style.display='none'; codehighlighter1_99_120_open_text.style.display="'none';" codehighlighter1_99_120_closed_image.style.display="'inline';" codehighlighter1_99_120_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_99_120_Closed_Image" onclick="this.style.display='none'; codehighlighter1_99_120_closed_text.style.display="'none';" codehighlighter1_99_120_open_image.style.display="'inline';" codehighlighter1_99_120_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;((n</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">==</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_99_120_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_99_120_Open_Text"><span style="color: #000000;">{&nbsp;n&nbsp;</span><span style="color: #000000;">&gt;&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1u</span><span style="color: #000000;">;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">count;&nbsp;}</span></span><span style="color: #000000;"><br><img id="Codehighlighter1_136_208_Open_Image" onclick="this.style.display='none'; codehighlighter1_136_208_open_text.style.display="'none';" codehighlighter1_136_208_closed_image.style.display="'inline';" codehighlighter1_136_208_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_136_208_Closed_Image" onclick="this.style.display='none'; codehighlighter1_136_208_closed_text.style.display="'none';" codehighlighter1_136_208_open_image.style.display="'inline';" codehighlighter1_136_208_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_136_208_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_136_208_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;n只能为1或3，n为3时，还要进行两步操作</span><span style="color: #008000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((n</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">n;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">n;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">count;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;count;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<p class="MsoNormal">&nbsp;</p><img src ="http://www.cppblog.com/flyinghearts/aggbug/118350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghearts/" target="_blank">flyinghearts</a> 2010-06-21 12:46 <a href="http://www.cppblog.com/flyinghearts/archive/2010/06/21/118350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>