﻿<?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++博客-Oliver's R&amp;D Lab-文章分类-Algorithm</title><link>http://www.cppblog.com/zenliang/category/15258.html</link><description>C/C++/Linux</description><language>zh-cn</language><lastBuildDate>Sun, 31 Oct 2010 01:55:34 GMT</lastBuildDate><pubDate>Sun, 31 Oct 2010 01:55:34 GMT</pubDate><ttl>60</ttl><item><title>快速反转一个字节</title><link>http://www.cppblog.com/zenliang/articles/131774.html</link><dc:creator>oliver</dc:creator><author>oliver</author><pubDate>Fri, 29 Oct 2010 10:50:00 GMT</pubDate><guid>http://www.cppblog.com/zenliang/articles/131774.html</guid><wfw:comment>http://www.cppblog.com/zenliang/comments/131774.html</wfw:comment><comments>http://www.cppblog.com/zenliang/articles/131774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zenliang/comments/commentRss/131774.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zenliang/services/trackbacks/131774.html</trackback:ping><description><![CDATA[题目：比如一个字节的二进制表示为abcd efgh，要求输出hgfe dcba？<br><br>代码如下：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;reverseChar(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;c)<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id=Codehighlighter1_43_150_Open_Image onclick="this.style.display='none'; Codehighlighter1_43_150_Open_Text.style.display='none'; Codehighlighter1_43_150_Closed_Image.style.display='inline'; Codehighlighter1_43_150_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_43_150_Closed_Image onclick="this.style.display='none'; Codehighlighter1_43_150_Closed_Text.style.display='none'; Codehighlighter1_43_150_Open_Image.style.display='inline'; Codehighlighter1_43_150_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_43_150_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_43_150_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(c</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x55</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;(c</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0xAA</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(c</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x33</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;(c</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0xCC</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(c</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x0F</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;(c</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0xF0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;c;<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<br>解释：第3行功能将abcd efgh变为badc fehg，第4行功能将badc fehg变为dcba hgfe，第5行功能将dcba hgfe变为hgfe dcba，OK!<br><br>思想类似&#8220;<a href="http://www.cppblog.com/zenliang/articles/131761.html"><span style="COLOR: red"><u>快速计算整数的二进制表示中含1的个数</u></span></a>&#8221;，采用归并方法。 
<img src ="http://www.cppblog.com/zenliang/aggbug/131774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zenliang/" target="_blank">oliver</a> 2010-10-29 18:50 <a href="http://www.cppblog.com/zenliang/articles/131774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速计算整数的二进制表示法中1的个数</title><link>http://www.cppblog.com/zenliang/articles/131761.html</link><dc:creator>oliver</dc:creator><author>oliver</author><pubDate>Fri, 29 Oct 2010 08:33:00 GMT</pubDate><guid>http://www.cppblog.com/zenliang/articles/131761.html</guid><wfw:comment>http://www.cppblog.com/zenliang/comments/131761.html</wfw:comment><comments>http://www.cppblog.com/zenliang/articles/131761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zenliang/comments/commentRss/131761.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zenliang/services/trackbacks/131761.html</trackback:ping><description><![CDATA[<p>题目：给定一个无符号32位整数x，求x的二进制表示法中含1的个数？<br><br>第一种算法：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;OneCount(unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x)<br><img id=Codehighlighter1_29_100_Open_Image onclick="this.style.display='none'; Codehighlighter1_29_100_Open_Text.style.display='none'; Codehighlighter1_29_100_Closed_Image.style.display='inline'; Codehighlighter1_29_100_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_29_100_Closed_Image onclick="this.style.display='none'; Codehighlighter1_29_100_Closed_Text.style.display='none'; Codehighlighter1_29_100_Open_Image.style.display='inline'; Codehighlighter1_29_100_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_29_100_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_29_100_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;x&gt;0;&nbsp;count</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">&amp;=</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">把最后面的1变0</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;count;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p><br>&nbsp;上面<span style="COLOR: #000000">算法的时间复杂度就是1的个数。<br><br>第二种算法（查表法）：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_19_31_Open_Image onclick="this.style.display='none'; Codehighlighter1_19_31_Open_Text.style.display='none'; Codehighlighter1_19_31_Closed_Image.style.display='inline'; Codehighlighter1_19_31_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_19_31_Closed_Image onclick="this.style.display='none'; Codehighlighter1_19_31_Closed_Text.style.display='none'; Codehighlighter1_19_31_Open_Image.style.display='inline'; Codehighlighter1_19_31_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;idx[</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_19_31_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_19_31_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<img src="http://www.cppblog.com/Images/dot.gif">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">0~255中含1的个数</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;OneCount(unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x)<br><img id=Codehighlighter1_75_150_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_150_Open_Text.style.display='none'; Codehighlighter1_75_150_Closed_Image.style.display='inline'; Codehighlighter1_75_150_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_75_150_Closed_Image onclick="this.style.display='none'; Codehighlighter1_75_150_Closed_Text.style.display='none'; Codehighlighter1_75_150_Open_Image.style.display='inline'; Codehighlighter1_75_150_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_75_150_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_75_150_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;&nbsp;x&gt;0;&nbsp;x</span><span style="COLOR: #000000">&gt;&gt;=</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">idx[x</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">255</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;count;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p>上面算法最多只需要4次循环，用空间换取时间。<br><br>第二种算法的另一种形式：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_19_30_Open_Image onclick="this.style.display='none'; Codehighlighter1_19_30_Open_Text.style.display='none'; Codehighlighter1_19_30_Closed_Image.style.display='inline'; Codehighlighter1_19_30_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_19_30_Closed_Image onclick="this.style.display='none'; Codehighlighter1_19_30_Closed_Text.style.display='none'; Codehighlighter1_19_30_Open_Image.style.display='inline'; Codehighlighter1_19_30_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;idx[</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_19_30_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_19_30_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,..,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;OneCount(unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x)<br><img id=Codehighlighter1_61_156_Open_Image onclick="this.style.display='none'; Codehighlighter1_61_156_Open_Text.style.display='none'; Codehighlighter1_61_156_Closed_Image.style.display='inline'; Codehighlighter1_61_156_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_61_156_Closed_Image onclick="this.style.display='none'; Codehighlighter1_61_156_Closed_Text.style.display='none'; Codehighlighter1_61_156_Open_Image.style.display='inline'; Codehighlighter1_61_156_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_61_156_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_61_156_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">x;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;idx[</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">idx[</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">idx[</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">idx[</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p><br>第三种算法：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;OneCount(unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x)<br><img id=Codehighlighter1_29_264_Open_Image onclick="this.style.display='none'; Codehighlighter1_29_264_Open_Text.style.display='none'; Codehighlighter1_29_264_Closed_Image.style.display='inline'; Codehighlighter1_29_264_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_29_264_Closed_Image onclick="this.style.display='none'; Codehighlighter1_29_264_Closed_Text.style.display='none'; Codehighlighter1_29_264_Open_Image.style.display='inline'; Codehighlighter1_29_264_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_29_264_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_29_264_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x55555555UL</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">((x</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x55555555UL</span><span style="COLOR: #000000">); //1<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x33333333UL</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">((x</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x33333333UL</span><span style="COLOR: #000000">);//2<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x0f0f0f0fUL</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">((x</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x0f0f0f0fUL</span><span style="COLOR: #000000">); //3<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x00ff00ffUL</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">((x</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x00ff00ffUL</span><span style="COLOR: #000000">); //4<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x0000ffffUL</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">((x</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x0000ffffUL</span><span style="COLOR: #000000">);//5<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;x;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p>解释：比如对于一个8位的整数122，用二进制表达<span style="COLOR: #ff00ff">01</span><span style="COLOR: red">11</span> <span style="COLOR: #0000ff">10</span><span style="COLOR: #800000">10</span>（abcd efgh），第1行代码的功能是x=0b0d 0f0h+0a0c 0e0g，两位一组，分别计算四组（a,b; c,d; e,f; g,h;&nbsp;）中1的个数，本例中x=0101 0000+0001 0101=<span style="COLOR: #ff00ff">01</span><span style="COLOR: red">10</span> <span style="COLOR: #0000ff">01</span><span style="COLOR: #800000">01</span>（更新的abcd efgh），在此基础上，再分组，就是第二行的功能x=00cd 00gh+00ab 00ef，四位一组（abcd； efgh），分别计算这两组包含1的个数，本例中x=00<span style="COLOR: #0000ff">10</span> 00<span style="COLOR: #ff0000">01</span>+00<span style="COLOR: #0000ff">01</span> 00<span style="COLOR: #ff0000">01</span>=00<span style="COLOR: #0000ff">11</span> 00<span style="COLOR: #ff0000">10</span>（更新abcd efgh），再8位一组，如第三行所示，x=0000 efgh+0000abcd=0000 0010+0000 0011=0000 0101=5，所以该整数122共包含5个1。<br><br>本算法思想：归并，对于一个32位的整数，先分成16组，统计每组（2位）中1的个数，再将统计的结果两两合并，得到8组，在此基础上又合并得到4组，2组，1组，进而得到最终结果。<br><br><br></span>&nbsp;</p>
<img src ="http://www.cppblog.com/zenliang/aggbug/131761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zenliang/" target="_blank">oliver</a> 2010-10-29 16:33 <a href="http://www.cppblog.com/zenliang/articles/131761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串（模式）匹配的KMP算法详解【转】</title><link>http://www.cppblog.com/zenliang/articles/131598.html</link><dc:creator>oliver</dc:creator><author>oliver</author><pubDate>Thu, 28 Oct 2010 02:08:00 GMT</pubDate><guid>http://www.cppblog.com/zenliang/articles/131598.html</guid><wfw:comment>http://www.cppblog.com/zenliang/comments/131598.html</wfw:comment><comments>http://www.cppblog.com/zenliang/articles/131598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zenliang/comments/commentRss/131598.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zenliang/services/trackbacks/131598.html</trackback:ping><description><![CDATA[<p>模式匹配的KMP算法详解</p>
<p>这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法。大概学过信息学的都知道，是个比较难理解的算法，今天特把它搞个彻彻底底明明白白。</p>
<p>注意到这是一个改进的算法，所以有必要把原来的模式匹配算法拿出来，其实理解的关键就在这里，一般的匹配算法：</p>
<p>int Index(String S,String T,int pos)//参考《数据结构》中的程序<br>{<br>&nbsp; i=pos;j=1;//这里的串的第1个元素下标是1<br>&nbsp; while(i&lt;=S.Length &amp;&amp; j&lt;=T.Length)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; if(S[i]==T[j]){++i;++j;}<br>&nbsp;&nbsp;&nbsp; else{i=i-j+2;j=1;}//**************(1)<br>&nbsp; }<br>&nbsp; if(j&gt;T.Length) return i-T.Length;//匹配成功<br>&nbsp; else return 0;<br>}</p>
<p>匹配的过程非常清晰，关键是当&#8216;失配&#8217;的时候程序是如何处理的？回溯，没错，注意到(1)句，为什么要回溯，看下面的例子：</p>
<p>S:aaaaabababcaaa&nbsp; T:ababc</p>
<p>aaaaabababcaaa<br>&nbsp;&nbsp;&nbsp; ababc.(.表示前一个已经失配)<br>回溯的结果就是<br>aaaaabababcaaa<br>&nbsp;&nbsp;&nbsp;&nbsp; a.(babc)<br>如果不回溯就是<br>aaaaabababcaaa<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aba.bc<br>这样就漏了一个可能匹配成功的情况<br>aaaaabababcaaa<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ababc</p>
<p>为什么会发生这样的情况？这是由T串本身的性质决定的，是因为T串本身有前后'部分匹配'的性质。如果T为abcdef这样的，大没有回溯的必要。</p>
<p>改进的地方也就是这里，我们从T串本身出发，事先就找准了T自身前后部分匹配的位置，那就可以改进算法。</p>
<p>如果不用回溯，那T串下一个位置从哪里开始呢？</p>
<p>还是上面那个例子，T为ababc，如果c失配，那就可以往前移到aba最后一个a的位置，像这样：<br>...ababd...<br>&nbsp;&nbsp; ababc<br>&nbsp;&nbsp; -&gt;ababc</p>
<p>这样i不用回溯，j跳到前2个位置，继续匹配的过程，这就是KMP算法所在。这个当T[j]失配后，j应该往前跳的值就是j的next值，它是由T串本身固有决定的，与S串无关。</p>
<p>《数据结构》上给了next值的定义：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 如果j=1<br>next[j]={Max{k|1&lt;k&lt;j且'p1...pk-1'='pj-k+1...pj-1'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; 其它情况</p>
<p>我当初看到这个头就晕了，其实它就是描述的我前面表述的情况，关于next[1]=0是规定的，这样规定可以使程序简单一些，如果非要定为其它的值只要不和后面的值冲突也是可以的；而那个Max是什么意思，举个例子：</p>
<p>T:aaab</p>
<p>...aaaab...<br>&nbsp;&nbsp; aaab<br>&nbsp; -&gt;aaab<br>&nbsp;&nbsp; -&gt;aaab<br>&nbsp;&nbsp;&nbsp; -&gt;aaab</p>
<p>像这样的T，前面自身部分匹配的部分不止两个，那应该往前跳到第几个呢？最近的一个，也就是说尽可能的向右滑移最短的长度。</p>
<p>OK，了解到这里，就看清了KMP的大部分内容，然后关键的问题是如何求next值？先不管它，先看如何用它来进行匹配操作，也就是说先假设已经有了next值。</p>
<p>将最前面的程序改写成：</p>
<p>int Index_KMP(String S,String T,int pos)<br>{<br>&nbsp; i=pos;j=1;//这里的串的第1个元素下标是1<br>&nbsp; while(i&lt;=S.Length &amp;&amp; j&lt;=T.Length)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; if(j==0 || S[i]==T[j]){++i;++j;} //注意到这里的j==0,和++j的作用就知道为什么规定next[1]=0的好处了<br>&nbsp;&nbsp;&nbsp; else j=next[j];//i不变（不回溯）,j跳动<br>&nbsp; }<br>&nbsp; if(j&gt;T.Length) return i-T.Length;//匹配成功<br>&nbsp; else return 0;<br>}</p>
<p>OK,是不是非常简单？还有更简单的，求next值，这也是整个算法成功的关键，从next值的定义来求太恐怖了，怎么求？前面说过了，next值表达的就是T串的自身部分匹配的性质，那么，我只要将T串和T串自身来一次匹配就可以求出来了，这里的匹配过程不是从头一个一个匹配，而是从T[1]和T[2]开始匹配，给出算法如下：</p>
<p>void get_next(String T,int &amp;next[])<br>{<br>&nbsp; i=1;j=0;next[1]=0;<br>&nbsp; while(i&lt;=T.Length)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; if(j==0 || T[i]==T[j]){++i;++j; next[i]=j;/**********(2)*/}<br>&nbsp;&nbsp;&nbsp; else j=next[j];<br>&nbsp; }<br>}</p>
<p>看这个函数是不是非常像KMP匹配的函数，没错，它就是这么干的！注意到(2)语句逻辑覆盖的时候是T[i]==T[j]以及i前面的、j前面的都匹配的情况下，于是先自增，然后记下来next[i]=j，这样每当i有自增就会求得一个next[i]，而j一定会小于等于i，于是对于已经求出来的next，可以继续求后面的next，而next[1]=0是已知，所以整个就这样递推的求出来了，方法非常巧妙。</p>
<p>这样的改进已经是很不错了，但算法还可以改进，注意到下面的匹配情况：</p>
<p>...aaac...<br>&nbsp;&nbsp; aaaa.<br>T串中的'a'和S串中的'c'失配，而'a'的next值指的还是'a'，那同样的比较还是会失配，而这样的比较是多余的，如果我事先知道，当T[i]==T[j]，那next[i]就设为next[j]，在求next值的时候就已经比较了，这样就可以去掉这样的多余的比较。于是稍加改进得到：</p>
<p>void get_nextval(String T,int &amp;next[])<br>{<br>&nbsp; i=1;j=0;next[1]=0;<br>&nbsp; while(i&lt;=T.Length)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; if(j==0 || T[i]==T[j])<br>&nbsp;&nbsp;&nbsp; { ++i;++j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(T[i]!=T[j]) next[i]=j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else next[i]=next[j];//消去多余的可能的比较,next再向前跳<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else j=next[j];<br>&nbsp; }<br>}</p>
<p>匹配算法不变。</p>
<p>到此就完全弄清楚了，以前老觉得KMP算法好神秘，真不是人想出来的，其实不然，它只不过是对原有的算法进行了改进。可见基础的经典的东西还是很重要，你有本事&#8216;废&#8217;了经典，就创造了进步。</p>
<img src ="http://www.cppblog.com/zenliang/aggbug/131598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zenliang/" target="_blank">oliver</a> 2010-10-28 10:08 <a href="http://www.cppblog.com/zenliang/articles/131598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>寻找丑数</title><link>http://www.cppblog.com/zenliang/articles/131094.html</link><dc:creator>oliver</dc:creator><author>oliver</author><pubDate>Sun, 24 Oct 2010 13:25:00 GMT</pubDate><guid>http://www.cppblog.com/zenliang/articles/131094.html</guid><wfw:comment>http://www.cppblog.com/zenliang/comments/131094.html</wfw:comment><comments>http://www.cppblog.com/zenliang/articles/131094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zenliang/comments/commentRss/131094.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zenliang/services/trackbacks/131094.html</trackback:ping><description><![CDATA[诺西笔试最后一道题，题意: <br>把只包含质因子2、3和5的数称作丑数（Ugly Number），例如：2,3,4,5,6,8,9,10,12,15,等，习惯上我们把1当做是第一个丑数。 <br>写一个高效算法，返回第n个丑数。<br><br>最普通（也最耗时）的做法是从1开始遍历，然后判断这个数的因式分解中只包含2,3,5，满足则找到了一个，一直找下去，直到第n个被找出！测试了一下，找第1500个丑数耗时40秒！<br><br>分析：假设数组ugly[N]中存放不断产生的丑数，初始只有一个丑数ugly[0]=1，由此出发，下一个丑数由因子2,3,5竞争产生，得到ugly[0]*2, ugly[0]*3, ugly[0]*5， 显然最小的那个数是新的丑数，所以第2个丑数为ugly[1]=2，开始新一轮的竞争，由于上一轮竞争中，因子2获胜，这时因子2应该乘以ugly[1]才显得公平，得到ugly[1]*2,ugly[0]*3,ugly[0]*5， 因子3获胜，ugly[2]=3，同理，下次竞争时因子3应该乘以ugly[1]，即：ugly[1]*2, ugly[1]*3, ugly[0]*5, 因子5获胜，得到ugly[3]=5，重复这个过程，直到第n个丑数产生。总之：每次竞争中有一个（也可能是两个）因子胜出，下一次竞争中&nbsp;胜出的因子就应该加大惩罚！<br><br>程序如下所示（只要把程序中的因子改一下就可以得到新的题目），耗时忽略不计：<br>运行结果：第1500个丑数：859963392， 第1691个丑数2 125&nbsp;764 000，第1692个丑数就越界了。<br>int表示的最大整数是2,147,483,647，可由std::cout&lt;&lt;(std::numeric_limits&lt;int&gt;::max)()&lt;&lt;"\n";给出！<br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #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">&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></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;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mymin(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c)&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_84_161_Open_Image onclick="this.style.display='none'; Codehighlighter1_84_161_Open_Text.style.display='none'; Codehighlighter1_84_161_Closed_Image.style.display='inline'; Codehighlighter1_84_161_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_84_161_Closed_Image onclick="this.style.display='none'; Codehighlighter1_84_161_Closed_Text.style.display='none'; Codehighlighter1_84_161_Open_Image.style.display='inline'; Codehighlighter1_84_161_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_84_161_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_84_161_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;temp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(a&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;a&nbsp;:&nbsp;b);&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(temp&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;c&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;temp&nbsp;:&nbsp;c);&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;FindUgly(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)&nbsp;</span><span style="COLOR: #008000">//<br></span><span style="COLOR: #008000"><img id=Codehighlighter1_205_858_Open_Image onclick="this.style.display='none'; Codehighlighter1_205_858_Open_Text.style.display='none'; Codehighlighter1_205_858_Closed_Image.style.display='inline'; Codehighlighter1_205_858_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_205_858_Closed_Image onclick="this.style.display='none'; Codehighlighter1_205_858_Closed_Text.style.display='none'; Codehighlighter1_205_858_Open_Image.style.display='inline'; Codehighlighter1_205_858_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_205_858_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_205_858_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ugly&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[n];&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;ugly[</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">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;index2&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;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;index3&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;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;index5&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;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;index&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(index&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;n)&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_381_702_Open_Image onclick="this.style.display='none'; Codehighlighter1_381_702_Open_Text.style.display='none'; Codehighlighter1_381_702_Closed_Image.style.display='inline'; Codehighlighter1_381_702_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_381_702_Closed_Image onclick="this.style.display='none'; Codehighlighter1_381_702_Closed_Text.style.display='none'; Codehighlighter1_381_702_Open_Image.style.display='inline'; Codehighlighter1_381_702_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_381_702_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_381_702_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;val&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mymin(ugly[index2]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;ugly[index3]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;ugly[index5]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">); //竞争产生下一个丑数&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(val&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;ugly[index2]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #008000">//将产生这个丑数的index*向后挪一位；</span><span style="COLOR: #008000">&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">index2;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(val&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;ugly[index3]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;//这里不能用elseif，因为可能有两个最小值，这时都要挪动；<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">index3;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(val&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;ugly[index5]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">index5;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ugly[index</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;val;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_708_784_Open_Image onclick="this.style.display='none'; Codehighlighter1_708_784_Open_Text.style.display='none'; Codehighlighter1_708_784_Closed_Image.style.display='inline'; Codehighlighter1_708_784_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_708_784_Closed_Image onclick="this.style.display='none'; Codehighlighter1_708_784_Closed_Text.style.display='none'; Codehighlighter1_708_784_Open_Image.style.display='inline'; Codehighlighter1_708_784_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_708_784_Closed_Text>/**/</span><span id=Codehighlighter1_708_784_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">/<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;++i)&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;ugly[i]&nbsp;&lt;&lt;&nbsp;endl;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;//</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ugly[n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;ugly;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;result;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_879_972_Open_Image onclick="this.style.display='none'; Codehighlighter1_879_972_Open_Text.style.display='none'; Codehighlighter1_879_972_Closed_Image.style.display='inline'; Codehighlighter1_879_972_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_879_972_Closed_Image onclick="this.style.display='none'; Codehighlighter1_879_972_Closed_Text.style.display='none'; Codehighlighter1_879_972_Open_Image.style.display='inline'; Codehighlighter1_879_972_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_879_972_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_879_972_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("input the number: \n");<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">num);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,FindUgly(num));&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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">;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br><br>
<img src ="http://www.cppblog.com/zenliang/aggbug/131094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zenliang/" target="_blank">oliver</a> 2010-10-24 21:25 <a href="http://www.cppblog.com/zenliang/articles/131094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>