﻿<?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/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 22 Apr 2026 00:46:08 GMT</lastBuildDate><pubDate>Wed, 22 Apr 2026 00:46:08 GMT</pubDate><ttl>60</ttl><item><title>SEH异常处理专利到期了</title><link>http://www.cppblog.com/flyinghearts/archive/2014/06/15/207288.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 15 Jun 2014 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2014/06/15/207288.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/207288.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2014/06/15/207288.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/207288.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/207288.html</trackback:ping><description><![CDATA[<div>　　<br />　　Borland的那个恶心的SEH异常处理专利（No:5,628,016&nbsp; Filed: June, 15, 1997），终于到期了。希望GCC/CLANG能快点完成win32的C++异常的SEH实现，下一版本的GCC，能让用户不再纠结SJLJ，Dwarf2的选择。<br /><br /></div><img src ="http://www.cppblog.com/flyinghearts/aggbug/207288.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> 2014-06-15 10:55 <a href="http://www.cppblog.com/flyinghearts/archive/2014/06/15/207288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>4</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>mingw gcc的头文件存在结构定义错误！！</title><link>http://www.cppblog.com/flyinghearts/archive/2013/03/21/198694.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Thu, 21 Mar 2013 13:51:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2013/03/21/198694.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/198694.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2013/03/21/198694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/198694.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/198694.html</trackback:ping><description><![CDATA[&nbsp;<br />准确的讲是mingw所用的sdk &#8212;&#8212;&nbsp; w32api，存在结构定义错误。<br />&nbsp;<br />&nbsp;打开wingdi.h 定位到 tagGCP_RESULTSW 的结构定义位置，<br />&nbsp;<br />&nbsp; typedef struct tagGCP_RESULTSW {<br />&nbsp;&nbsp;&nbsp; DWORD lStructSize;<br />&nbsp;&nbsp;&nbsp; LPWSTR lpOutString;<br />&nbsp;&nbsp;&nbsp; UINT *lpOrder;<br />&nbsp;&nbsp;&nbsp; int *lpDx;<br />&nbsp;&nbsp;&nbsp; int *lpCaretPos;<br />&nbsp;&nbsp;&nbsp; LPWSTR lpClass;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //正确的类型应该是 LPSTR <br />&nbsp;&nbsp;&nbsp; LPWSTR lpGlyphs;<br />&nbsp;&nbsp;&nbsp; UINT nGlyphs;<br />&nbsp;&nbsp;&nbsp; int nMaxFit;<br />&nbsp; } GCP_RESULTSW,*LPGCP_RESULTSW;<br /><br />&nbsp;根据msdn, lpClass的类型应该是 LPSTR， w32api却将其声明为 LPWSTR。<br />&nbsp;<br />&nbsp; 这个bug，在2011年就有人报告了，据说cvs版本也修正了，但是直到现在，官方下载还是2011年发布的那个有bug的版本（w32api-3.17-2-mingw32-dev.tar.lzma）。<br />&nbsp; <br />&nbsp; 另外，mingw-w64（支持生成32位、64位程序）不存在这个问题。 <p>&nbsp;</p><img src ="http://www.cppblog.com/flyinghearts/aggbug/198694.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 21:51 <a href="http://www.cppblog.com/flyinghearts/archive/2013/03/21/198694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++11 最反直觉的地方</title><link>http://www.cppblog.com/flyinghearts/archive/2012/11/22/195570.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Thu, 22 Nov 2012 11:49:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/11/22/195570.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/195570.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/11/22/195570.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/195570.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/195570.html</trackback:ping><description><![CDATA[<div><br />1 auto 会自动把 引用 去除掉<br />&nbsp; <br />&nbsp; int&amp; get();<br />&nbsp; auto k = get();&nbsp;&nbsp;&nbsp;&nbsp; // k的类型是int，而不是int&amp;<br />&nbsp;<br />&nbsp; Derived object;<br />&nbsp; auto&amp;&nbsp;&nbsp;&nbsp; same_object = (Base&amp;)object;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp; auto&nbsp; another_object = (Base&amp;)object;&nbsp; //会重新构造个Base对象 &nbsp;<br />&nbsp; <br />&nbsp;&nbsp; &nbsp;<br />2 decltype 有时会自动把 引用 加上<br /><br />&nbsp; int x;<br />&nbsp; decltype((x)) 和 decltype(*&amp;x) 的类型是int&amp;，而不是int<br />&nbsp; <br />&nbsp; 在宏中使用decltype时，要特别注意别多加了括号。<br />&nbsp; <br />&nbsp; 下面这段代码错在哪里？<br />&nbsp;&nbsp;&nbsp; template&lt;typename T, typename R&gt;<br />&nbsp;&nbsp;&nbsp; auto min(T t, R r) -&gt; decltype(t &lt; r ? t : r)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (t &lt; r ? t : r);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; &nbsp;<br />&nbsp; decltype(t &lt; r ? t : r)的类型是T&amp;或R&amp;，而不是所希望的T或R！<br />&nbsp; <br />&nbsp; <br />&nbsp; 标准是这样规定的：<br /><br />The type denoted by decltype(e) is defined as follows:<br />&nbsp; &#8212; if e is an unparenthesized id-expression or an unparenthesized class member<br />&nbsp;&nbsp;&nbsp;&nbsp; access (5.2.5), decltype(e) is the type of the entity named by e. If there<br />&nbsp;&nbsp;&nbsp;&nbsp; is no such entity, or if e names a set of overloaded functions, the program<br />&nbsp;&nbsp;&nbsp;&nbsp; is ill-formed;<br />&nbsp; &#8212; otherwise, if e is an xvalue, decltype(e) is T&amp;&amp;, where T is the type of e;<br />&nbsp; &#8212; otherwise, if e is an lvalue, decltype(e) is T&amp;, where T is the type of e;<br />&nbsp; &#8212; otherwise, decltype(e) is the type of e.<br />&nbsp; <br /><br />3 std::move、std::forward、右值引用<br />&nbsp; <br />&nbsp; C++11 引入 右值引用，可以做到：函数转发、针对临时对象优化<br />&nbsp; move是动词，从字面上理解好像是要移动对象，其实std::move只是简单的将类型转成右值引用而已！！！ 可以理解成 cast_to_rvalue_reference 或 treat_as_temporal_object。<br />&nbsp; <br /><br />&nbsp; void test1(int&amp;&amp;) {}<br />&nbsp; <br />&nbsp; void test2(int&amp;&amp; value)&nbsp; //注意：value的类型是int，而不是int&amp;&amp;<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; test1(value);&nbsp;&nbsp;&nbsp; //无法编译通过，因为value的类型是int！ 必须转换类型<br />&nbsp;&nbsp;&nbsp;&nbsp; test1(static_cast&lt;int&amp;&amp;&gt;(value));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //或者<br />&nbsp;&nbsp;&nbsp;&nbsp; test1(std::forward&lt;int&gt;(value));<br />&nbsp; }<br />&nbsp; <br />&nbsp; test2函数中，value的类型是int，而不是int&amp;&amp;。<br />&nbsp; 这是一个不得已的选择。如果value的类型是int&amp;&amp;的话，就会有副作用：<br />&nbsp; <br />&nbsp; void increase(int&amp; value) { ++value; }<br />&nbsp; void test3(int&amp;&amp; value) { increase(value); }<br />&nbsp; <br />&nbsp; char ch = 'a';<br />&nbsp; test3(ch);&nbsp; //本意是改变ch值，但实际上ch值不会改变，改变的是临时对像<br />&nbsp; 通过转发函数test3，increase函数可以修改临时对像，<br />&nbsp; 这造成程序员犯的错误（如上面的例子），难以在编译时就被找出来。<br />&nbsp; <br />&nbsp; <br />&nbsp; std::forward&lt;T&gt;(value) 等价于 static_cast&lt;T&amp;&amp;&gt;(value)，感觉后者更容易理解。<br />&nbsp; std::forward 起到的转发作用。如果T类型为 R&amp;、 R&amp;&amp;，经过类型转换后，其类型还是和原来的一样。<br />&nbsp; 在C++11中 <br />&nbsp;&nbsp;&nbsp; R&amp;&nbsp; &amp;&nbsp;&nbsp; 等同于 R&amp;&nbsp;&nbsp; （在c++03中，R&amp; &amp;这种写法是非法的）<br />&nbsp;&nbsp;&nbsp; R&amp;&amp; &amp;&nbsp;&nbsp; 等同于 R&amp;<br />&nbsp;&nbsp;&nbsp; R&amp;&nbsp; &amp;&amp;&nbsp; 等同于 R&amp;<br />&nbsp;&nbsp;&nbsp; R&amp;&amp; &amp;&amp;&nbsp; 等同于 R&amp;&amp;<br />&nbsp;</div><img src ="http://www.cppblog.com/flyinghearts/aggbug/195570.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-11-22 19:49 <a href="http://www.cppblog.com/flyinghearts/archive/2012/11/22/195570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>decltype的小“陷阱”</title><link>http://www.cppblog.com/flyinghearts/archive/2012/08/14/187204.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 14 Aug 2012 13:19:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/08/14/187204.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/187204.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/08/14/187204.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/187204.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/187204.html</trackback:ping><description><![CDATA[int x;<br /><div>decltype(x) 和&nbsp; decltype((x))&nbsp; &nbsp; 的类型是不一样的。</div><div>decltype(x) 和&nbsp; decltype(*&amp;x)&nbsp;&nbsp; 的类型是不一样的。<br /><div></div><br /><div>decltype(x)的类型是 int<br />decltype((x)) 和 decltype(*&amp;x)&nbsp; 的类型是 int&amp;<br /><div><br />C++11标准：</div></div></div><div>The type denoted by decltype(e) is defined as follows:<br />&nbsp; &#8212; if e is an unparenthesized id-expression or an unparenthesized class member<br />&nbsp;&nbsp;&nbsp;&nbsp; access (5.2.5), decltype(e) is the type of the entity named by e. If there<br />&nbsp;&nbsp;&nbsp;&nbsp; is no such entity, or if e names a set of overloaded functions, the program<br />&nbsp;&nbsp;&nbsp;&nbsp; is ill-formed;<br />&nbsp; &#8212; otherwise, if e is an xvalue, decltype(e) is T&amp;&amp;, where T is the type of e;<br />&nbsp; &#8212; otherwise, if e is an lvalue, decltype(e) is T&amp;, where T is the type of e;<br />&nbsp; &#8212; otherwise, decltype(e) is the type of e.</div><img src ="http://www.cppblog.com/flyinghearts/aggbug/187204.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-08-14 21:19 <a href="http://www.cppblog.com/flyinghearts/archive/2012/08/14/187204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内嵌汇编实现的函数转发</title><link>http://www.cppblog.com/flyinghearts/archive/2012/08/05/186382.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 05 Aug 2012 13:02:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/08/05/186382.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/186382.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/08/05/186382.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/186382.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/186382.html</trackback:ping><description><![CDATA[&nbsp; 弄着玩的。功能是简单的实现函数转发，即<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用CALL(func)，转为调用func()，<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用CALL(func, arg1, arg2) ，转为调用func(arg1, arg2)</div><br /><div>&nbsp; 代码中，宏CALL/STDCALL分别用来调用&nbsp; __cdecl/__stdcall 调用规定的函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsafe_call 两者都可调用，但它不是多线程安全的。<br /><br />&nbsp; 代码只支持x86 32位， 除内嵌汇编部分，尽量符合C++11标准。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>原理：<br />&nbsp;&nbsp;&nbsp;&nbsp; 刚进入函数时，<br />&nbsp;&nbsp;&nbsp;&nbsp; [esp]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数返回地址<br />&nbsp;&nbsp;&nbsp;&nbsp; [esp + 4]&nbsp;&nbsp;&nbsp;&nbsp; 第一个参数，即转发函数的地址<br /><div>&nbsp;&nbsp;&nbsp;&nbsp; [esp + 8]&nbsp;&nbsp;&nbsp;&nbsp; 第二个参数，即转发函数的的第一个参数</div>&nbsp; &nbsp;&nbsp; ...&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只要写三行汇编指令实现一个c_call函数，就可调用转发函数<br /><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop eax&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; ; eax为函数返回地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xchg dword ptr[esp], eax&nbsp;&nbsp;&nbsp;&nbsp; ; eax为转发函数的地址，[esp]为函数返回地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp eax<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><div>&nbsp;&nbsp;&nbsp;&nbsp; 当转发函数是__cdecl，即转发函数不会调节栈，由于在c_call，pop eax，使esp多加了4，因而在调用完c_call后应该手动将esp值减4，保证栈平衡。<br />&nbsp;&nbsp;&nbsp; <div>&nbsp;&nbsp;&nbsp; 当转发函数是__stdcall，转发函数会调节栈，调用转发函数完毕后，栈已经保持平衡，因而调用c_call完毕，不应该进行栈指针调节。似乎将c_call的调用改为__stdcall即可，但实际上c_call有变长参数，改成__stdcall没效果，每次调用编译器还是会自动生成调节栈指针代码。因而只能每次调用完毕，编译器给esp加了多少，就手动减多少。（编译器不一定会生成 call&nbsp; xxxx; add esp, xx这样的代码，通过改函数返回地址，忽略后面的add esp, xx指令是很糟糕的做法。）</div></div> </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_202018" onclick="this.style.display='none'; Code_Closed_Text_202018.style.display='none'; Code_Open_Image_202018.style.display='inline'; Code_Open_Text_202018.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" height="16" align="top" width="11"><img id="Code_Open_Image_202018" style="display: none" onclick="this.style.display='none'; Code_Open_Text_202018.style.display='none'; Code_Closed_Image_202018.style.display='inline'; Code_Closed_Text_202018.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" align="top" width="11"><span id="Code_Closed_Text_202018" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">call_redirect</span><span id="Code_Open_Text_202018" 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;&nbsp;1</span>&nbsp;<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 /></span><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">cstdarg</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">windows.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;CALL(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;&nbsp;&nbsp;&nbsp;c_call(__VA_ARGS__);&nbsp;ASM_SUB_ESP(4);</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;STDCALL(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;c_call(__VA_ARGS__);&nbsp;ASM_SUB_ESP(MACRO_ARGS(__VA_ARGS__)&nbsp;*&nbsp;4);</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MACRO_EXPAND(x)&nbsp;x</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MACRO_NTH_ARG(a0,&nbsp;a1,&nbsp;a2,&nbsp;a3,&nbsp;a4,&nbsp;a5,&nbsp;a6,&nbsp;a7,&nbsp;a8,&nbsp;a9,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;a9</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MACRO_ARGS(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;\</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;MACRO_EXPAND(MACRO_NTH_ARG(__VA_ARGS__,&nbsp;</span><span style="color: #000000; ">9</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))<br /></span><span style="color: #008080; ">&nbsp;12</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#if</span><span style="color: #000000; ">&nbsp;&nbsp;__GNUC__</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;please&nbsp;enable&nbsp;option,&nbsp;-masm=intel</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;15</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;ASM_SUB_ESP(x)&nbsp;asm("lea&nbsp;esp,&nbsp;dword&nbsp;ptr[esp&nbsp;-&nbsp;%0]"&nbsp;:&nbsp;:&nbsp;"i"(x))</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;c_call(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pfn,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">c_call</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&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;\n\</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;c_call:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;eax;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xchg&nbsp;dword&nbsp;ptr[esp],&nbsp;eax;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;eax;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;unsafe_call(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pfn,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;&nbsp;asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">unsafe_call</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&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;\n\</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lcomm&nbsp;old_ret_addr,&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lcomm&nbsp;old_esp_value,</span><span style="color: #000000; ">4</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;unsafe_call:&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;\n\<br /></span><span style="color: #008080; ">&nbsp;30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;dword&nbsp;ptr&nbsp;old_ret_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;dword&nbsp;ptr&nbsp;old_esp_value,&nbsp;esp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;eax,&nbsp;dword&nbsp;ptr[esp];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;dword&nbsp;ptr[esp],&nbsp;offset&nbsp;last;&nbsp;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;eax;&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;\n\<br /></span><span style="color: #008080; ">&nbsp;35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;last:&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;\n\<br /></span><span style="color: #008080; ">&nbsp;36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;esp,&nbsp;dword&nbsp;ptr&nbsp;old_esp_value;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;dword&nbsp;ptr&nbsp;old_ret_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\<br /></span><span style="color: #008080; ">&nbsp;38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;39</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#elif</span><span style="color: #000000; ">&nbsp;&nbsp;_MSC_VER</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;ASM_SUB_ESP(x)&nbsp;__asm&nbsp;lea&nbsp;esp,&nbsp;dword&nbsp;ptr&nbsp;[esp&nbsp;-&nbsp;x]</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;42</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;__declspec(naked)&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;c_call(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pfn,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)<br /></span><span style="color: #008080; ">&nbsp;44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;__asm&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;eax;<br /></span><span style="color: #008080; ">&nbsp;47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xchg&nbsp;dword&nbsp;ptr[esp],&nbsp;eax;<br /></span><span style="color: #008080; ">&nbsp;48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;eax;<br /></span><span style="color: #008080; ">&nbsp;49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;__declspec(naked)&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;unsafe_call(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pfn,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)<br /></span><span style="color: #008080; ">&nbsp;52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;old_ret_addr;<br /></span><span style="color: #008080; ">&nbsp;54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;old_esp_value;<br /></span><span style="color: #008080; ">&nbsp;55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;__asm&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;old_ret_addr;<br /></span><span style="color: #008080; ">&nbsp;57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;old_esp_value,&nbsp;esp;<br /></span><span style="color: #008080; ">&nbsp;58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;eax,&nbsp;dword&nbsp;ptr[esp];<br /></span><span style="color: #008080; ">&nbsp;59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;dword&nbsp;ptr[esp],&nbsp;offset&nbsp;last;<br /></span><span style="color: #008080; ">&nbsp;60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;eax;<br /></span><span style="color: #008080; ">&nbsp;61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;last:<br /></span><span style="color: #008080; ">&nbsp;62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;esp,&nbsp;old_esp_value;<br /></span><span style="color: #008080; ">&nbsp;63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;old_ret_addr;<br /></span><span style="color: #008080; ">&nbsp;64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;66</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;67</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">#error</span><span style="color: #000000; ">&nbsp;"only&nbsp;gcc&nbsp;and&nbsp;msvc&nbsp;are&nbsp;supported"</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;69</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;70</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;71</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;72</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;show(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;format,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)<br /></span><span style="color: #008080; ">&nbsp;73</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;va_list&nbsp;args;<br /></span><span style="color: #008080; ">&nbsp;75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;va_start(args,&nbsp;format);<br /></span><span style="color: #008080; ">&nbsp;76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;vprintf(format,&nbsp;args);<br /></span><span style="color: #008080; ">&nbsp;77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;va_end&nbsp;(args);<br /></span><span style="color: #008080; ">&nbsp;78</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;79</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;80</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;mysleep()&nbsp;{&nbsp;Sleep(</span><span style="color: #000000; ">10</span><span style="color: #000000; ">);&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;81</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;82</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test1()<br /></span><span style="color: #008080; ">&nbsp;83</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;84</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;85</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;show(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;+&nbsp;%d&nbsp;=&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;a,&nbsp;b,&nbsp;a&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;b);<br /></span><span style="color: #008080; ">&nbsp;86</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;CALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)printf,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;+&nbsp;%d&nbsp;=&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;a,&nbsp;b,&nbsp;a&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;b);<br /></span><span style="color: #008080; ">&nbsp;87</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;CALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)mysleep);<br /></span><span style="color: #008080; ">&nbsp;88</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;CALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)show,&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;+&nbsp;%d&nbsp;=&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;a,&nbsp;b,&nbsp;a&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;b);<br /></span><span style="color: #008080; ">&nbsp;89</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;90</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;91</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test2()<br /></span><span style="color: #008080; ">&nbsp;92</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;93</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;STDCALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)MessageBoxA,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">text1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">caption1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;MB_OK);<br /></span><span style="color: #008080; ">&nbsp;94</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;STDCALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)Sleep,&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;95</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;STDCALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)MessageBoxA,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">text2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">caption2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;MB_OK);<br /></span><span style="color: #008080; ">&nbsp;96</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;STDCALL((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)Sleep,&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;97</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;98</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;99</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test3()<br /></span><span style="color: #008080; ">100</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">101</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">102</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)printf,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;+&nbsp;%d&nbsp;=&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;a,&nbsp;b,&nbsp;a&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;b);<br /></span><span style="color: #008080; ">103</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)mysleep);<br /></span><span style="color: #008080; ">104</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)show,&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;+&nbsp;%d&nbsp;=&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;a,&nbsp;b,&nbsp;a&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;b);<br /></span><span style="color: #008080; ">105</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)MessageBoxA,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">text1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">caption1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;MB_OK);<br /></span><span style="color: #008080; ">106</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)Sleep,&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">107</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)MessageBoxA,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">text2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">caption2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;MB_OK);<br /></span><span style="color: #008080; ">108</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsafe_call((</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)Sleep,&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">109</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">110</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">111</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; ">112</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">113</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;test1();<br /></span><span style="color: #008080; ">114</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;test2();<br /></span><span style="color: #008080; ">115</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;test3();<br /></span><span style="color: #008080; ">116</span>&nbsp;<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 /></span><span style="color: #008080; ">117</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">118</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">119</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">120</span> <span style="color: #000000; "></span></span></div><img src ="http://www.cppblog.com/flyinghearts/aggbug/186382.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-08-05 21:02 <a href="http://www.cppblog.com/flyinghearts/archive/2012/08/05/186382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些老游戏CPU 100%占用的解决方法</title><link>http://www.cppblog.com/flyinghearts/archive/2012/05/15/175005.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 15 May 2012 12:26:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/05/15/175005.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/175005.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/05/15/175005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/175005.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/175005.html</trackback:ping><description><![CDATA[<br />下载：<a href="/Files/flyinghearts/peekmsg.7z" title="peekmsg">peekmsg</a><br /><br /><div>用法：<br /> &nbsp;&nbsp;&nbsp; peekmsg.exe&nbsp;&nbsp; 游戏主程序<br /> &nbsp;&nbsp;&nbsp; 或用lordpe，打开游戏主程序，导入peekmsg.dll中的init<br /><br /> </div><div>原理：<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hook PeekMessage函数，用Sleep、WaitForMultipleObjects等函数让出CPU时间片。 <br /><br /> </div><img src ="http://www.cppblog.com/flyinghearts/aggbug/175005.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-05-15 20:26 <a href="http://www.cppblog.com/flyinghearts/archive/2012/05/15/175005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三国志5剧本修改器 1.2</title><link>http://www.cppblog.com/flyinghearts/archive/2012/05/15/175004.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 15 May 2012 12:14:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/05/15/175004.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/175004.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/05/15/175004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/175004.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/175004.html</trackback:ping><description><![CDATA[&nbsp; <br />内置剧本改为加强版剧本，保存剧本时，同时生成普通版/加强版剧本。<br />（没时间测试，可能在更改宝物所有者时，会有一些bug）<br /><br /><a href="/Files/flyinghearts/san5_script_editor1.2.7z" title="三国志5剧本修改器1.2">三国志5剧本修改器1.2</a><br />&nbsp;<img src ="http://www.cppblog.com/flyinghearts/aggbug/175004.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-05-15 20:14 <a href="http://www.cppblog.com/flyinghearts/archive/2012/05/15/175004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安全的整数比较</title><link>http://www.cppblog.com/flyinghearts/archive/2012/03/30/169554.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Fri, 30 Mar 2012 12:16:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/03/30/169554.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/169554.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/03/30/169554.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/169554.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/169554.html</trackback:ping><description><![CDATA[<br />前几天在水母上看到的题：<br /><br /><div>正常的比较 assert(-1 &lt; 1U) 是会失败的。因为 -1 会提升成无符号数。<br />写一个安全的比较函数，使得<br />template &lt;typename T1, typename T2&gt;<br />int SafeIntCompare(T1 i1, T2 i2);<br />如果 i1 真实值 &lt;&nbsp; i2，返回 -1<br />&nbsp;&nbsp;&nbsp;&nbsp; i1 真实值 == i2，返回&nbsp; 0<br />&nbsp;&nbsp;&nbsp;&nbsp; i1 真实值 &gt;&nbsp; i2，返回&nbsp; 1</div><br /><br />只有当两个类型一个是有符号、另一个是无符号时，才需要特殊处理。<br />对类型的符号判断，可以直接判断该类型的-1是否比0小，也可以用标准库std::numeric_limits&lt;T&gt;中的is_signed成员。<br /><br />简单的做法：<br /><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; ">template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;SafeIntCompare(T1&nbsp;v1,&nbsp;T2&nbsp;v2)<br />{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&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;t1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;std::numeric_limits</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::is_signed;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&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;t2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;std::numeric_limits</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::is_signed;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(t1&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;t2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(t1&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;v1&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(t2&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;v2&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</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; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(v1&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;v2)&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; ">if</span><span style="color: #000000; ">&nbsp;(v1&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;v2)&nbsp;&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 />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />}</span></div><br /><div>但由于进行比较的两个数可能分别是：有符号数和无符号数，编译时编译器会给出大量的警告。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 要避免有符号数和无符号数的进行直接比较，就必须将它们都转为同一个类型T。这个类型的确定可以采用两种方法：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 1 比较原来两个类型是否是有符号数以及它们所占用的字节数，来推断出应该将它们都转为哪种类型T，这是vc那个safeint的做法。<br /><br />&nbsp; &nbsp;&nbsp; 2 采用这个trick：将这两个类型的数（数可以取0）直接相加，得到的结果的类型就是所求的。这是因为：两个数进行比较时，采用的类型转换规则和两个数相加时所采用的规则是一致的。<br /><br /><br /><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_195336" onclick="this.style.display='none'; Code_Closed_Text_195336.style.display='none'; Code_Open_Image_195336.style.display='inline'; Code_Open_Text_195336.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" height="16" width="11" align="top"><img id="Code_Open_Image_195336" style="display: none" onclick="this.style.display='none'; Code_Open_Text_195336.style.display='none'; Code_Closed_Image_195336.style.display='inline'; Code_Closed_Text_195336.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" height="16" width="11" align="top"><span id="Code_Closed_Text_195336" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">改成后的代码</span><span id="Code_Open_Text_195336" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "><br /><br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Assert&nbsp;{};<br />template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Assert</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">;<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;is_first_negtive,&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;is_second_negtive</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;SafeIntCmpImpl<br />{<br />&nbsp;&nbsp;template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;int_cmp(T1&nbsp;v1,&nbsp;T2&nbsp;v2)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(v1&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;v2)&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;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(v1&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;v2)&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 />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />};<br /><br />template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;SafeIntCmpImpl</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />{<br />&nbsp;&nbsp;template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2,&nbsp;typename&nbsp;T3</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;int_cmp(T1&nbsp;v1,&nbsp;T2&nbsp;v2,&nbsp;T3)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;SafeIntCmpImpl</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::int_cmp(T3(v1),&nbsp;T3(v2));<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;int_cmp(T1&nbsp;v1,&nbsp;T2&nbsp;v2)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;v1&nbsp;</span><span style="color: #000000; ">&lt;</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;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;:&nbsp;int_cmp(v1,&nbsp;v2,&nbsp;T1(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;T2(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;}<br />};<br /><br />template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;SafeIntCmpImpl</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />{<br />&nbsp;&nbsp;template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;int_cmp(T1&nbsp;v1,&nbsp;T2&nbsp;v2)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">SafeIntCmpImpl</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::int_cmp(v2,&nbsp;v1);<br />&nbsp;&nbsp;}<br />};<br /><br /><br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;SafeIntCompare(T1&nbsp;v1,&nbsp;T2&nbsp;v2)<br />{<br />&nbsp;&nbsp;typedef&nbsp;std::numeric_limits</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;M1;<br />&nbsp;&nbsp;typedef&nbsp;std::numeric_limits</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;M2;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&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_arg_valid&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;M1::is_integer&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;M2::is_integer;<br />&nbsp;&nbsp;Assert</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">is_arg_valid</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;SafeIntCmpImpl</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">M1::is_signed,&nbsp;M2::is_signed</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::int_cmp(v1,&nbsp;v2);<br />}<br /></span></span></div><br />&nbsp; 但上面的写法有一个问题：如果一个 short和一个unsigned char进行比较，编译器都是转为int进行比较，没有必要进行特殊处理（上面的代码处理后会多一个与0的比较）。实际上，如果两个类型都是转为有符号类型，可以直接进行比较。</div>最终代码：<br /><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 />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;IsSigned&nbsp;{&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&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;value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;T(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;T(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;<br />};<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Assert&nbsp;{};<br />template</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Assert</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">;<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Type&nbsp;{};<br />typedef&nbsp;Type</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;TagNormal;<br />typedef&nbsp;Type</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;TagFirstArgIsSigned;<br />typedef&nbsp;Type</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;TagSecondArgIsSigned;<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2,&nbsp;typename&nbsp;T3</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;SafeIntCompare(T1&nbsp;v1,&nbsp;T2&nbsp;v2,&nbsp;T3,&nbsp;TagNormal)<br />{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(v1&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;v2)&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 />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(v1&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;v2)&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; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />}<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2,&nbsp;typename&nbsp;T3</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;SafeIntCompare(T1&nbsp;v1,&nbsp;T2&nbsp;v2,&nbsp;T3&nbsp;v3,&nbsp;TagFirstArgIsSigned)<br />{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(v1&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</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 />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;SafeIntCompare(T3(v1),&nbsp;T3(v2),&nbsp;v3,&nbsp;TagNormal());<br />}<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2,&nbsp;typename&nbsp;T3</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;SafeIntCompare(T1&nbsp;v1,&nbsp;T2&nbsp;v2,&nbsp;T3&nbsp;v3,&nbsp;TagSecondArgIsSigned)<br />{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(v2&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</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; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;SafeIntCompare(T3(v1),&nbsp;T3(v2),&nbsp;v3,&nbsp;TagNormal());<br />}<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2,&nbsp;typename&nbsp;T3</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;SafeIntCompare(T1&nbsp;v1,&nbsp;T2&nbsp;v2,&nbsp;T3&nbsp;v3)<br />{<br />&nbsp;&nbsp;typedef&nbsp;std::numeric_limits</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;M1;<br />&nbsp;&nbsp;typedef&nbsp;std::numeric_limits</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;M2;<br />&nbsp;&nbsp;typedef&nbsp;std::numeric_limits</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T3</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;M3;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&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_arg_valid&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;M1::is_integer&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;M2::is_integer;<br />&nbsp;&nbsp;Assert</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">is_arg_valid</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&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;type_idx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;M3::is_signed&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;(M1::is_signed&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;M2::is_signed&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="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;SafeIntCompare(v1,&nbsp;v2,&nbsp;v3,&nbsp;Type</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">type_idx</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">());<br />}<br /><br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1,&nbsp;typename&nbsp;T2</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;SafeIntCompare(T1&nbsp;v1,&nbsp;T2&nbsp;v2)<br />{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;SafeIntCompare(v1,&nbsp;v2,&nbsp;T1(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;T2(</span><span style="color: #000000; ">0</span><span style="color: #000000;">));<br />}<br /></span></div><img src ="http://www.cppblog.com/flyinghearts/aggbug/169554.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-30 20:16 <a href="http://www.cppblog.com/flyinghearts/archive/2012/03/30/169554.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/168270.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 18 Mar 2012 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/03/18/168270.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/168270.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/03/18/168270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/168270.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/168270.html</trackback:ping><description><![CDATA[<div align="center">目&nbsp; 录</div><div></div><br /><br /><div><div><a id="_222cfbb558fe_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl01_TitleUrl" href="../archive/2012/02/28/166713.html">面试题精解之一： 二叉树</a></div>&nbsp;1&nbsp; 求二叉树中相距最远的两个节点之间的距离<br />&nbsp;2&nbsp; 判断二叉树是否平衡二叉树<br />&nbsp;3&nbsp; 指定二叉树，给定两节点求其最近共同父节点<br />&nbsp;4&nbsp; 二叉树的广度遍历、逐层打印二叉树节点数据、只打印某层节点数据<br />&nbsp;5&nbsp; 在二叉树中找出和（叶子到根节点路径上的所有节点的数据和）为指定值的所有路径。<br />&nbsp;6&nbsp; 将二叉查找树转为有序的双链表<br />&nbsp;7&nbsp; 求二叉树的镜像<br />&nbsp;8&nbsp; 二叉树前序、中序、后序遍历的非递归实现<br />&nbsp;9&nbsp; 求二叉树高度的非递归实现<br />10&nbsp; 连接二叉树同一层上的结点</div><br /><br /><div><div><a id="viewpost1_TitleUrl" href="../archive/2012/03/18/168269.html">面试题精解之二： 字符串、数组（1）</a></div> <div><div>&nbsp;1 在一个字符串中找到第一个只出现一次的字符，如输入abac，则输出b。<br />&nbsp;2 输出字符串的所有组合，如"abc"输出a、b、c、ab、ac、bc、abc。<br />&nbsp;3 根据条件找出两个数。<br />&nbsp;&nbsp; &#9312;&nbsp; 数组中，除了两个数字出现奇数次外，其它数字都出现偶数次，找出这两个数字：<br />&nbsp;&nbsp; &#9313;&nbsp; 长度为n的数组，由数字1到n组成，其中数字a不出现，数字b出现两次，其它的数字恰好出现一次。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在不修改原数组的情况下，找出数字a和数字b。<br />&nbsp;4 求数组（或环状数组）的最大连续（或不连续）子序列和。<br /><br /></div> </div></div><br /><img src ="http://www.cppblog.com/flyinghearts/aggbug/168270.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 22:24 <a href="http://www.cppblog.com/flyinghearts/archive/2012/03/18/168270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面试题精解之二： 字符串、数组（1）</title><link>http://www.cppblog.com/flyinghearts/archive/2012/03/18/168269.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 18 Mar 2012 13:28:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/03/18/168269.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/168269.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/03/18/168269.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/168269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/168269.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 面试题精解之二： 字符串、数组（1）&nbsp;本篇文章发表在下面三个博客中，如果出现排版问题，请移步到另一个博客。http://www.cppblog.com/flyingheartshttp://www.cnblogs.com/flyingheartshttp://blog.csdn.net/flyinghearts&nbsp;1&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2012/03/18/168269.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/168269.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:28 <a href="http://www.cppblog.com/flyinghearts/archive/2012/03/18/168269.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/2012/02/28/166713.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 28 Feb 2012 12:54:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2012/02/28/166713.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/166713.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2012/02/28/166713.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/166713.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/166713.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 面试题精解之一： 二叉树 &nbsp; 本篇文章发表在下面三个博客中，如果出现排版问题，请移步到另一个博客。 http://www.cppblog.com/flyinghearts http://www.cnblogs.com/flyinghearts http://blog.csdn.net/flyinghearts &nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 求二叉树中相...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghearts/archive/2012/02/28/166713.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/166713.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 20:54 <a href="http://www.cppblog.com/flyinghearts/archive/2012/02/28/166713.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>三国志5剧本修改器 1.1</title><link>http://www.cppblog.com/flyinghearts/archive/2011/08/07/152739.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Sun, 07 Aug 2011 15:24:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/08/07/152739.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/152739.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/08/07/152739.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/152739.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/152739.html</trackback:ping><description><![CDATA[&nbsp;<br />&nbsp; 给以前写的剧本修改器，加了个界面，本想用wtl，但是代码中用到不少&#8220;初始化列表&#8221;等c++11新特性，只好让VC2010靠边站了。对mingw，好用的gui库还真没有，想想就十几个消息，干脆直接调用windows api得了。<br /><br /><a href="/Files/flyinghearts/san5_script_editor.7z" title="三国志5剧本编辑器">&nbsp; 三国志5剧本编辑器</a><img src ="http://www.cppblog.com/flyinghearts/aggbug/152739.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-08-07 23:24 <a href="http://www.cppblog.com/flyinghearts/archive/2011/08/07/152739.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>VC 2010　error D8027，无法执行c1xx.dll的解决方法</title><link>http://www.cppblog.com/flyinghearts/archive/2011/07/19/151417.html</link><dc:creator>flyinghearts</dc:creator><author>flyinghearts</author><pubDate>Tue, 19 Jul 2011 14:07:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghearts/archive/2011/07/19/151417.html</guid><wfw:comment>http://www.cppblog.com/flyinghearts/comments/151417.html</wfw:comment><comments>http://www.cppblog.com/flyinghearts/archive/2011/07/19/151417.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghearts/comments/commentRss/151417.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghearts/services/trackbacks/151417.html</trackback:ping><description><![CDATA[<br /><div>　　晚上想跑个程序，结果VC 2010头一次罢工：　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; cl: 命令行 error D8027 :无法执行&#8220;E:\prog\vc2010\bin\c1xx.dll&#8221;<br />&nbsp;&nbsp;&nbsp;&nbsp; 上网搜索了下，也没找到一个解决方法（<a href="http://msdn.microsoft.com/en-us/library/733t42a9.aspx">官方说明</a>）。正郁闷着，突然间想到cl.exe可以正常运行，而c1xx.dll不能正常运行，会不会是c1xx.dll的依赖库出问题了，于是调出dependency一查，果然少了个msvcp100.dll（估计是某个卸载软件造成的），从别处拷贝一个到bin目录，问题解决。<br /></div><img src ="http://www.cppblog.com/flyinghearts/aggbug/151417.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-19 22:07 <a href="http://www.cppblog.com/flyinghearts/archive/2011/07/19/151417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>