﻿<?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++博客-Fly me to the moon-随笔分类-算法</title><link>http://www.cppblog.com/xiaoyisnail/category/11805.html</link><description>the beauty of C++</description><language>zh-cn</language><lastBuildDate>Mon, 05 Oct 2009 06:15:35 GMT</lastBuildDate><pubDate>Mon, 05 Oct 2009 06:15:35 GMT</pubDate><ttl>60</ttl><item><title>笔面试题目记录(一)</title><link>http://www.cppblog.com/xiaoyisnail/archive/2009/09/30/97663.html</link><dc:creator>翼帆</dc:creator><author>翼帆</author><pubDate>Wed, 30 Sep 2009 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/xiaoyisnail/archive/2009/09/30/97663.html</guid><wfw:comment>http://www.cppblog.com/xiaoyisnail/comments/97663.html</wfw:comment><comments>http://www.cppblog.com/xiaoyisnail/archive/2009/09/30/97663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaoyisnail/comments/commentRss/97663.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaoyisnail/services/trackbacks/97663.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 找工作的第一场仗打得非常漂亮，能在国庆前就拿到一个不错的offer回家算是一个完美的开局了，不过接下去的10月，11月才是重头戏，希望也能完美收官吧。刚刚回到家里，打算把前两天笔试面试中碰到的一些题目记录在这里，并给出自己的实现。以后每过一阶段都会在这里总结一次碰到的题目，加以整理和进一步的思考，为后面的硬仗做好充分的准备。fighting~快慢指针判断单链表是否有环这题是出现在笔试题里的一道选择...&nbsp;&nbsp;<a href='http://www.cppblog.com/xiaoyisnail/archive/2009/09/30/97663.html'>阅读全文</a><img src ="http://www.cppblog.com/xiaoyisnail/aggbug/97663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaoyisnail/" target="_blank">翼帆</a> 2009-09-30 16:27 <a href="http://www.cppblog.com/xiaoyisnail/archive/2009/09/30/97663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本算法练习(二)</title><link>http://www.cppblog.com/xiaoyisnail/archive/2009/09/28/97483.html</link><dc:creator>翼帆</dc:creator><author>翼帆</author><pubDate>Mon, 28 Sep 2009 12:36:00 GMT</pubDate><guid>http://www.cppblog.com/xiaoyisnail/archive/2009/09/28/97483.html</guid><wfw:comment>http://www.cppblog.com/xiaoyisnail/comments/97483.html</wfw:comment><comments>http://www.cppblog.com/xiaoyisnail/archive/2009/09/28/97483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaoyisnail/comments/commentRss/97483.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaoyisnail/services/trackbacks/97483.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这两天狂累，研究报告、宣讲会、见面会、笔试、面试所有的事情都连续在一起，忙得够呛，今天面完阿里研究院，总算有点时间了，于是先把上次提到的其它一些基本算法练习完成。这次的练习包括：原地堆排序，归并排序，基于快排的选择，计数排序，插值查找。原地heap sort使用最大堆，基于两个堆的基本操作siftdown和siftup实现如下两个步骤，事实上代码里只用了siftdown，注意：这里的堆是从下标0开...&nbsp;&nbsp;<a href='http://www.cppblog.com/xiaoyisnail/archive/2009/09/28/97483.html'>阅读全文</a><img src ="http://www.cppblog.com/xiaoyisnail/aggbug/97483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaoyisnail/" target="_blank">翼帆</a> 2009-09-28 20:36 <a href="http://www.cppblog.com/xiaoyisnail/archive/2009/09/28/97483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本算法练习(一)</title><link>http://www.cppblog.com/xiaoyisnail/archive/2009/09/22/96939.html</link><dc:creator>翼帆</dc:creator><author>翼帆</author><pubDate>Tue, 22 Sep 2009 06:02:00 GMT</pubDate><guid>http://www.cppblog.com/xiaoyisnail/archive/2009/09/22/96939.html</guid><wfw:comment>http://www.cppblog.com/xiaoyisnail/comments/96939.html</wfw:comment><comments>http://www.cppblog.com/xiaoyisnail/archive/2009/09/22/96939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaoyisnail/comments/commentRss/96939.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaoyisnail/services/trackbacks/96939.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 笔试面试中常常会要求应聘者用自己最擅长的语言实现一些基本算法，这种考基本功的问题还是需要认真对待的。很多基本算法虽然表面上思想很简单，但在实现为程序的时候却总是会有很多非常tricky的问题让你阴沟里翻船，要么死循环了，要么数组越界了，要么整数溢出了。所以平时多练练手，在笔试面试的时候可以短时间内正确地实现这些算法，就可以给面试官一个基本功扎实的好印象，还能增加自信心，绝对能给笔试面试加不少分。下...&nbsp;&nbsp;<a href='http://www.cppblog.com/xiaoyisnail/archive/2009/09/22/96939.html'>阅读全文</a><img src ="http://www.cppblog.com/xiaoyisnail/aggbug/96939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaoyisnail/" target="_blank">翼帆</a> 2009-09-22 14:02 <a href="http://www.cppblog.com/xiaoyisnail/archive/2009/09/22/96939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>位运算之美——用+,-和位运算实现正整数除法和取模(二)</title><link>http://www.cppblog.com/xiaoyisnail/archive/2009/09/21/96883.html</link><dc:creator>翼帆</dc:creator><author>翼帆</author><pubDate>Mon, 21 Sep 2009 14:12:00 GMT</pubDate><guid>http://www.cppblog.com/xiaoyisnail/archive/2009/09/21/96883.html</guid><wfw:comment>http://www.cppblog.com/xiaoyisnail/comments/96883.html</wfw:comment><comments>http://www.cppblog.com/xiaoyisnail/archive/2009/09/21/96883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaoyisnail/comments/commentRss/96883.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaoyisnail/services/trackbacks/96883.html</trackback:ping><description><![CDATA[<p><span style="color: #000000;">作者：</span><a href="http://www.cppblog.com/xiaoyisnail/"><u><font color="#800080">翼帆@cppblog</font></u></a>&nbsp; <br>原文地址：<a title="http://www.cppblog.com/xiaoyisnail/archive/2009/09/21/96883.html" href="http://www.cppblog.com/xiaoyisnail/archive/2009/09/21/96883.html">http://www.cppblog.com/xiaoyisnail/archive/2009/09/21/96883.html</a><br><span style="color: #ff0000;">本文版权归作者和cppblog共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 </span><font face="宋体"><br><br>终于有时间写本文的第二部分了。在</font><a href="http://www.cppblog.com/xiaoyisnail/archive/2009/09/19/96707.html"><font color="#0066aa" face="宋体">上一篇</font></a><font face="宋体">文章(下文中称为&#8220;文(一)&#8221;)中，我提出了一个具体的问题&#8220;<font color="#ff0000">只能</font>用+,-和位运算实现<span style="color: red;">正</span>整数除法(/)和取模(%)&#8221;，并整理了一些和位运算相关的题目和算法，本文将给出上述问题的一个完整的解答思路和实现。</font></p>
<p><font face="宋体">首先思考最简单的除法实现，即循环减除数，减到不能再减为止，所减次数即所求的商，事实上这就是我们初学四则运算时对除法的定义，实现：</font></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;integer_div_0(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dividend,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img id="Codehighlighter1_45_177_Open_Image" onclick="this.style.display='none'; codehighlighter1_45_177_open_text.style.display="'none';" codehighlighter1_45_177_closed_image.style.display="'inline';" codehighlighter1_45_177_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_45_177_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_45_177_closed_text.style.display="'none';" codehighlighter1_45_177_open_image.style.display="'inline';" codehighlighter1_45_177_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_45_177_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_45_177_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(divisor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br></span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_66_106_Open_Image" onclick="this.style.display='none'; codehighlighter1_66_106_open_text.style.display="'none';" codehighlighter1_66_106_closed_image.style.display="'inline';" codehighlighter1_66_106_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_66_106_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_66_106_closed_text.style.display="'none';" codehighlighter1_66_106_open_image.style.display="'inline';" codehighlighter1_66_106_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_66_106_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_66_106_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">非法参数，除零错</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br></span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;res&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">((dividend</span><span style="color: #000000;">-=</span><span style="color: #000000;">divisor)</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br></span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">res;<br></span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;res;<br></span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></div>
<br>很显然，这个简单的实现是非常低效的，求integer_div_0(a,b)的时间复杂度为O(a/b)，当a很大b很小时，计算开销很大，有什么办法能提高效率吗？考虑到循环减除数同时比较差是否大于等于0有点类似于在一个一个数组或是linked list中顺序搜索某个目标值，在较差的情况下近似于搜索整个问题空间，这样的开销必然很大，那么只要找到某个方法来减少需要搜索的问题空间就可以提高性能了。于是，自然可以想到如下算法：以除数为初始测试值，以2的指数为步长来搜索问题空间，当被除数与测试值的差小于除数时便结束搜索，若在这之前测试值大于被除数，则将被除数减去前一个测试值，并重复上述过程直到搜索结束。举个例子，求1200/3：<br>顺序搜索时，我们要与1200比较的数有：3,6,9,12,15,...,1998,2001，比较次数667次<br>以2的指数为步长搜索时，与1200比较3,6,12,24,48,96,192,384,768,1536，然后与1200-768=432再进行比较3,6,12,24,48,96,192,384,768，再取432-384=48比较3,6,12,24,48，搜索结束，比较次数共24次，比顺序搜索有很大的提高。你可能会问，为什么要以2的指数为步长来搜索呢？答案是，这样我们就可以使用位操作来进一步提高计算效率了。下面是这个算法的实现：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;integer_div_1(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dividend,&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img id="Codehighlighter1_63_332_Open_Image" onclick="this.style.display='none'; codehighlighter1_63_332_open_text.style.display="'none';" codehighlighter1_63_332_closed_image.style.display="'inline';" codehighlighter1_63_332_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_63_332_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_63_332_closed_text.style.display="'none';" codehighlighter1_63_332_open_image.style.display="'inline';" codehighlighter1_63_332_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_63_332_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_63_332_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(divisor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br></span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_84_124_Open_Image" onclick="this.style.display='none'; codehighlighter1_84_124_open_text.style.display="'none';" codehighlighter1_84_124_closed_image.style.display="'inline';" codehighlighter1_84_124_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_84_124_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_84_124_closed_text.style.display="'none';" codehighlighter1_84_124_open_image.style.display="'inline';" codehighlighter1_84_124_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_84_124_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_84_124_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">非法参数，除零错</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br></span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dividend&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;divisor)&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;">10</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">,c</span><span style="color: #000000;">=</span><span style="color: #000000;">divisor,&nbsp;res</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(;dividend</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">c;c</span><span style="color: #000000;">&lt;&lt;=</span><span style="color: #000000;">1</span><span style="color: #000000;">,k</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dividend</span><span style="color: #000000;">-</span><span style="color: #000000;">c&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">&lt;&lt;</span><span style="color: #000000;">k;<br></span><span style="color: #008080;">15</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">16</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;integer_div_1(dividend</span><span style="color: #000000;">-</span><span style="color: #000000;">(c</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">1</span><span style="color: #000000;">),&nbsp;divisor)</span><span style="color: #000000;">+</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">(k</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">));<br></span><span style="color: #008080;">17</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></div>
注意到最后一行的尾递归，再把代码优化为非递归如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #008000;">//</span><span style="color: #008000;">非递归整数除法</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;integer_div_2(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dividend,&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img id="Codehighlighter1_73_442_Open_Image" onclick="this.style.display='none'; codehighlighter1_73_442_open_text.style.display="'none';" codehighlighter1_73_442_closed_image.style.display="'inline';" codehighlighter1_73_442_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_73_442_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_73_442_closed_text.style.display="'none';" codehighlighter1_73_442_open_image.style.display="'inline';" codehighlighter1_73_442_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_73_442_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_73_442_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(divisor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br></span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img id="Codehighlighter1_94_134_Open_Image" onclick="this.style.display='none'; codehighlighter1_94_134_open_text.style.display="'none';" codehighlighter1_94_134_closed_image.style.display="'inline';" codehighlighter1_94_134_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_94_134_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_94_134_closed_text.style.display="'none';" codehighlighter1_94_134_open_image.style.display="'inline';" codehighlighter1_94_134_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_94_134_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_94_134_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">非法参数，除零错</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br></span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dividend&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;divisor)&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;">11</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k,&nbsp;c,&nbsp;res</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(dividend&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">14</span><span style="color: #000000;"><img id="Codehighlighter1_227_426_Open_Image" onclick="this.style.display='none'; codehighlighter1_227_426_open_text.style.display="'none';" codehighlighter1_227_426_closed_image.style.display="'inline';" codehighlighter1_227_426_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_227_426_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_227_426_closed_text.style.display="'none';" codehighlighter1_227_426_open_image.style.display="'inline';" codehighlighter1_227_426_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_227_426_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_227_426_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">15</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(k</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">,c</span><span style="color: #000000;">=</span><span style="color: #000000;">divisor;dividend</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">c;c</span><span style="color: #000000;">&lt;&lt;=</span><span style="color: #000000;">1</span><span style="color: #000000;">,k</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">16</span><span style="color: #000000;"><img id="Codehighlighter1_274_346_Open_Image" onclick="this.style.display='none'; codehighlighter1_274_346_open_text.style.display="'none';" codehighlighter1_274_346_closed_image.style.display="'inline';" codehighlighter1_274_346_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_274_346_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_274_346_closed_text.style.display="'none';" codehighlighter1_274_346_open_image.style.display="'inline';" codehighlighter1_274_346_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_274_346_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_274_346_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">17</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dividend</span><span style="color: #000000;">-</span><span style="color: #000000;">c&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">18</span><span style="color: #000000;"><img id="Codehighlighter1_307_340_Open_Image" onclick="this.style.display='none'; codehighlighter1_307_340_open_text.style.display="'none';" codehighlighter1_307_340_closed_image.style.display="'inline';" codehighlighter1_307_340_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_307_340_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_307_340_closed_text.style.display="'none';" codehighlighter1_307_340_open_image.style.display="'inline';" codehighlighter1_307_340_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_307_340_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_307_340_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">19</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">k;<br></span><span style="color: #008080;">20</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #008080;">21</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">22</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">23</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dividend</span><span style="color: #000000;">-</span><span style="color: #000000;">c&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">24</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #008080;">25</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">26</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">(k</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">27</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dividend&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;c</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br></span><span style="color: #008080;">28</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">29</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">30</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;res;<br></span><span style="color: #008080;">31</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></div>
最后，有了整数除法，取模运算就很简单了，从进行整数除法搜索商的最后一步立刻就能得到模除的余数，实现如下，为了方便起见，代码里使用C++ STL中的pair模板以同时返回商和余数：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #008000;">//</span><span style="color: #008000;">整数除法and取模，返回商和余数</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;">pair</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;integer_div_3(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dividend,&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img id="Codehighlighter1_92_566_Open_Image" onclick="this.style.display='none'; codehighlighter1_92_566_open_text.style.display="'none';" codehighlighter1_92_566_closed_image.style.display="'inline';" codehighlighter1_92_566_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_92_566_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_92_566_closed_text.style.display="'none';" codehighlighter1_92_566_open_image.style.display="'inline';" codehighlighter1_92_566_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_92_566_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_92_566_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(divisor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br></span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img id="Codehighlighter1_113_153_Open_Image" onclick="this.style.display='none'; codehighlighter1_113_153_open_text.style.display="'none';" codehighlighter1_113_153_closed_image.style.display="'inline';" codehighlighter1_113_153_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_113_153_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_113_153_closed_text.style.display="'none';" codehighlighter1_113_153_open_image.style.display="'inline';" codehighlighter1_113_153_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_113_153_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_113_153_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">非法参数，除零错</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br></span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dividend&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;divisor)&nbsp;<br></span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;make_pair(</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;dividend);<br></span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k,&nbsp;c,&nbsp;quotient</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;remainder;<br></span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(dividend&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">15</span><span style="color: #000000;"><img id="Codehighlighter1_286_523_Open_Image" onclick="this.style.display='none'; codehighlighter1_286_523_open_text.style.display="'none';" codehighlighter1_286_523_closed_image.style.display="'inline';" codehighlighter1_286_523_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_286_523_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_286_523_closed_text.style.display="'none';" codehighlighter1_286_523_open_image.style.display="'inline';" codehighlighter1_286_523_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_286_523_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_286_523_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">16</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(k</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">,c</span><span style="color: #000000;">=</span><span style="color: #000000;">divisor;dividend</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">c;c</span><span style="color: #000000;">&lt;&lt;=</span><span style="color: #000000;">1</span><span style="color: #000000;">,k</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">17</span><span style="color: #000000;"><img id="Codehighlighter1_333_438_Open_Image" onclick="this.style.display='none'; codehighlighter1_333_438_open_text.style.display="'none';" codehighlighter1_333_438_closed_image.style.display="'inline';" codehighlighter1_333_438_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_333_438_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_333_438_closed_text.style.display="'none';" codehighlighter1_333_438_open_image.style.display="'inline';" codehighlighter1_333_438_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_333_438_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_333_438_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">18</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dividend</span><span style="color: #000000;">-</span><span style="color: #000000;">c&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">19</span><span style="color: #000000;"><img id="Codehighlighter1_366_432_Open_Image" onclick="this.style.display='none'; codehighlighter1_366_432_open_text.style.display="'none';" codehighlighter1_366_432_closed_image.style.display="'inline';" codehighlighter1_366_432_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_366_432_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_366_432_closed_text.style.display="'none';" codehighlighter1_366_432_open_image.style.display="'inline';" codehighlighter1_366_432_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_366_432_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_366_432_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">20</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quotient&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">k;<br></span><span style="color: #008080;">21</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remainder&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dividend</span><span style="color: #000000;">-</span><span style="color: #000000;">c;<br></span><span style="color: #008080;">22</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #008080;">23</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">24</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">25</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dividend</span><span style="color: #000000;">-</span><span style="color: #000000;">c&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;divisor)<br></span><span style="color: #008080;">26</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #008080;">27</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">28</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quotient&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">(k</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">29</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dividend&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;c</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br></span><span style="color: #008080;">30</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">31</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">32</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;make_pair(quotient,&nbsp;remainder);<br></span><span style="color: #008080;">33</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></div>
<p>写到这里，算是把全文的任务都完成了，读者可能觉得文(一)和文(二)里讲到的一些题目的关系不大，但我写这两篇文章的目的就是想强调<span style="color: red;">位运算的作用</span>，或者说<span style="color: red;">二进制的美</span>，很多时候如果我们换个角度，用二进制来思考问题，也许会突然&#8220;Aha!Insight!&#8221;，从而得到一个优美的解答。</p>
<p><br></p>
附上代码：<a title="http://www.cppblog.com/Files/xiaoyisnail/bits.rar"  href="http://www.cppblog.com/Files/xiaoyisnail/bits.rar">http://www.cppblog.com/Files/xiaoyisnail/bits.rar</a><img src ="http://www.cppblog.com/xiaoyisnail/aggbug/96883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaoyisnail/" target="_blank">翼帆</a> 2009-09-21 22:12 <a href="http://www.cppblog.com/xiaoyisnail/archive/2009/09/21/96883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>位运算之美——用+,-和位运算实现正整数除法和取模(一)</title><link>http://www.cppblog.com/xiaoyisnail/archive/2009/09/19/96707.html</link><dc:creator>翼帆</dc:creator><author>翼帆</author><pubDate>Sat, 19 Sep 2009 05:58:00 GMT</pubDate><guid>http://www.cppblog.com/xiaoyisnail/archive/2009/09/19/96707.html</guid><wfw:comment>http://www.cppblog.com/xiaoyisnail/comments/96707.html</wfw:comment><comments>http://www.cppblog.com/xiaoyisnail/archive/2009/09/19/96707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaoyisnail/comments/commentRss/96707.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaoyisnail/services/trackbacks/96707.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 9月21日，对本文从格式到部分内容上都进行了修改另外，鉴于某些转载没有注明出处，考虑到版权问题，特声明如下：作者：翼帆@cppblog&nbsp; 原文地址：http://www.cppblog.com/xiaoyisnail/archive/2009/09/19/96707.html本文版权归作者和cppblog共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否...&nbsp;&nbsp;<a href='http://www.cppblog.com/xiaoyisnail/archive/2009/09/19/96707.html'>阅读全文</a><img src ="http://www.cppblog.com/xiaoyisnail/aggbug/96707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaoyisnail/" target="_blank">翼帆</a> 2009-09-19 13:58 <a href="http://www.cppblog.com/xiaoyisnail/archive/2009/09/19/96707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态规划解抛鸡蛋(玻璃球)问题</title><link>http://www.cppblog.com/xiaoyisnail/archive/2009/09/18/96638.html</link><dc:creator>翼帆</dc:creator><author>翼帆</author><pubDate>Fri, 18 Sep 2009 06:31:00 GMT</pubDate><guid>http://www.cppblog.com/xiaoyisnail/archive/2009/09/18/96638.html</guid><wfw:comment>http://www.cppblog.com/xiaoyisnail/comments/96638.html</wfw:comment><comments>http://www.cppblog.com/xiaoyisnail/archive/2009/09/18/96638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaoyisnail/comments/commentRss/96638.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaoyisnail/services/trackbacks/96638.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 昨天早上看了题经典老题，抛玻璃球，也有的版本是抛鸡蛋，可惜昨天早上愣是没做出来，下午忙别的事去了，到了晚上看了ChinaUnix上的一篇<a href="http://bbs.chinaunix.net/viewthread.php?tid=868766&amp;extra=&amp;page=1">讨论帖</a>才知道如何解，事实上我一开始对题目的理解就错了，于是根本没有想到用DP。今天总算有时间整理一下思路，并把代码实现出来了。<br>&nbsp;&nbsp;&nbsp; 题目是这样的：一个100层的大厦，你手中有两个相同的玻璃球。从这个大厦的某一层扔下围棋<br>
子就会碎，用你手中的这两个玻璃围棋子，找出一个最优的策略，来得知那个临界层面。<br>&nbsp;&nbsp;&nbsp; 这里的最优策略指的是在这种策略下无论哪个临界层面在第几层，测试的次数最少。我一开始就是把题意理解错了，给了一个非最优解，后来看了CU那的讨论后才明白了是用动态规划来做，并可以把题目扩展为n层大厦用k个玻璃球来测试。<br>&nbsp;&nbsp;&nbsp; 设F(n,k)为用k个玻璃球来测试n层大厦的临界层的最少次数，状态转移方程如下：<br>&nbsp;&nbsp;&nbsp; F(n,k)=min{max{F(r,k-1), F(n-r,k)}+1, 1&lt;=r&lt;=n}<br>&nbsp;&nbsp;&nbsp; 边界条件:F(n,1)=n-1, F(1,k)=F(0,k)=0<br>&nbsp;&nbsp;&nbsp; 状态转移方程可以这样来考虑，假设在n层楼中的第r层抛一次(对应方程中的"+1")，会有两种情况发生：<br>&nbsp;&nbsp;&nbsp; (1)玻璃球碎，说明在第1到第r层楼中必有一层为临界层，问题转化为一个子问题：求F(r,k-1)<br>&nbsp;&nbsp;&nbsp; (2)玻璃球不碎，说明临界层在第r+1层到第n层这n-r层楼中，问题转化为子问题:求F(n-r,k)<br>&nbsp;&nbsp;&nbsp; 因为考虑的是最坏情况下抛球策略的所需测试次数的最小值，所以取这两种情况中的较大值，并遍历每一个可能的r，取其最小值即得到F(n,k)。<br>&nbsp;&nbsp;&nbsp; 实现代码如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">fstream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sstream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cmath</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iomanip</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vector</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">deque</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">queue</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stack</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">map</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">algorithm</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">limits</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">utility</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ctime</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bitset</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;MAX_FLOOR&nbsp;512</span><span style="color: #000000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;MAX_BALL&nbsp;&nbsp;100</span><span style="color: #000000;"><br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dp(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k)<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(k</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;n</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">1</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;">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">错误输入</span><span style="color: #008000;"><br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(k</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;n</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">去掉一些trivial&nbsp;case</span><span style="color: #008000;"><br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(n</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;">)&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;">29</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;M[MAX_BALL][MAX_FLOOR];<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,j,r;<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;temp,&nbsp;min;<br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">k;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;M[i][</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">M[i][</span><span style="color: #000000;">1</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">F(1,k)=F(0,k)=0</span><span style="color: #008000;"><br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(j</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;j</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">n;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;M[</span><span style="color: #000000;">1</span><span style="color: #000000;">][j]</span><span style="color: #000000;">=</span><span style="color: #000000;">j</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">F(n,1)=n-1</span><span style="color: #008000;"><br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;状态转移方程：<br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;F(n,k)=min{max{F(r,k-1)+1,&nbsp;F(n-r,k)+1},&nbsp;1&lt;=r&lt;=n}<br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">k;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(j</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;j</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">n;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;numeric_limits</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::max();<br></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(r</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;r</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">j;r</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;max(M[i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">][r],&nbsp;M[i][j</span><span style="color: #000000;">-</span><span style="color: #000000;">r])</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br></span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(temp</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">min)<br></span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp;<br></span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;M[i][j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;min;<br></span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">53</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">54</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;M[k][n];</span><span style="color: #008000;">//</span><span style="color: #008000;">F(n,k)</span><span style="color: #008000;"><br></span><span style="color: #008080;">55</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">}<br></span><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br></span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,k;<br></span><span style="color: #008080;">60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cin</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">n</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">k;<br></span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">dp(n,&nbsp;k)</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br></span><span style="color: #008080;">63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&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;">65</span>&nbsp;<span style="color: #000000;">}</span></div>
<br>
input: 100 2&nbsp; output: 14<br>input: 300 3&nbsp; output: 13<br> <img src ="http://www.cppblog.com/xiaoyisnail/aggbug/96638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaoyisnail/" target="_blank">翼帆</a> 2009-09-18 14:31 <a href="http://www.cppblog.com/xiaoyisnail/archive/2009/09/18/96638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wrong</title><link>http://www.cppblog.com/xiaoyisnail/archive/2009/09/16/96393.html</link><dc:creator>翼帆</dc:creator><author>翼帆</author><pubDate>Wed, 16 Sep 2009 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/xiaoyisnail/archive/2009/09/16/96393.html</guid><wfw:comment>http://www.cppblog.com/xiaoyisnail/comments/96393.html</wfw:comment><comments>http://www.cppblog.com/xiaoyisnail/archive/2009/09/16/96393.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/xiaoyisnail/comments/commentRss/96393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiaoyisnail/services/trackbacks/96393.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">感谢Will同学指出的问题，我仔细思考后发现不只是代码的问题，算法思想上就有错了，我没有在每次交换后保持两个子序列的有序性，这样就无法保证i和j指向正确的位置，而如果想要保持子序列有序，虽然可以引入一个临时变量并通过交换实现，但算法复杂度就不是线性的了，所以结论是暂时没有可以简单实现的线性时间原地归并。事实上，有一些paper描述了很多线性时间原地归并的算法，但是复杂度都相当高，感兴趣的朋友可以自行google。</span><br>&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">为了不误导大家，把题目改了，至于下面的笔试题，希望牛人给予解答啊，谢谢。</span><br><br>---------------------------------------原文分割线-----------------------------------------------<br>&nbsp;&nbsp;&nbsp; 快要找工作了，现在在回顾一些算法和数据结构的知识，除了看书，争取每天挑一两道有趣的题目来练练手。本人没参加过ACM，解算法题的实力也相当菜鸟，但本人对于任何能够锻炼思维能力的题目都相当热衷，不怕做不出来，就怕不敢做，做多了，思考多了，总是有帮助的，呵呵，所以希望各位看到我的文章中有错误的地方请不吝赐教，在下感激不尽。<br>Share is happiness.<br><br>&nbsp;&nbsp;&nbsp; 今天的题目是在网上看到的，ms是一道baidu的笔试题：<br>&nbsp;&nbsp;&nbsp; 给定一个序列a[0...n-1]和一整数m，满足0&lt;=m&lt;=n-1，且a[0...m-1]和a[m...n-1]都为有序子序列，要求设计一个时间复杂度为O(N)，空间复杂度为O(1)的算法，实现将这两个子序列合并为一个完整的有序序列a[0...n-1]。<br><br>&nbsp;&nbsp;&nbsp; 题意很简单，就是要设计一个线性时间的原地归并算法，我给出的思路：<br>&nbsp;&nbsp;&nbsp; 从左到右遍历数组，将当前未遍历元素中的最小值置换到它所应在的位置。这个简单的描述有点像选择排序，但选择排序O(N^2)的复杂度明显是不允许的，这里，利用两个子序列已有序的性质，我们可以设计更高效的O(N)算法：首先易知未遍历元素中的最小值必定是两个子序列的最小值中的更小者，将改值交换到它应在的位置；利用有序性，可以在遍历过程中分别记录两个子序列的当前最小元素的位置，这样就省去了选择排序中每次都要遍历剩余序列找出最小值的开销，每次遍历内部为常数次的比较和交换操作，所以整个算法的时间复杂度为O(N)。<br>   <img src ="http://www.cppblog.com/xiaoyisnail/aggbug/96393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiaoyisnail/" target="_blank">翼帆</a> 2009-09-16 11:07 <a href="http://www.cppblog.com/xiaoyisnail/archive/2009/09/16/96393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>