﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-冬日飘雪-文章分类-算法</title><link>http://www.cppblog.com/HenDanTou/category/12569.html</link><description>自是一道风景</description><language>zh-cn</language><lastBuildDate>Wed, 06 Jan 2010 19:15:37 GMT</lastBuildDate><pubDate>Wed, 06 Jan 2010 19:15:37 GMT</pubDate><ttl>60</ttl><item><title>构造Gray码的分治算法</title><link>http://www.cppblog.com/HenDanTou/articles/104237.html</link><dc:creator>HenDanTou</dc:creator><author>HenDanTou</author><pubDate>Sun, 27 Dec 2009 15:38:00 GMT</pubDate><guid>http://www.cppblog.com/HenDanTou/articles/104237.html</guid><wfw:comment>http://www.cppblog.com/HenDanTou/comments/104237.html</wfw:comment><comments>http://www.cppblog.com/HenDanTou/articles/104237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/HenDanTou/comments/commentRss/104237.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/HenDanTou/services/trackbacks/104237.html</trackback:ping><description><![CDATA[<div class=cnt id=blog_text>
<p>问题描述：Gray码是一个长度为2的N次幂的序列，序列中无相同元素，每个元素都是长度为N位的（0，1）串，相邻元素恰好只有一位不同，用分置策略设计一个算法对任意的N构造相应的Gray码。</p>
<p>分析：</p>
<p>当N=1 时的GRAY码为：0 ，1</p>
<p>当N=2 时的GRAY码为：00，01，11，10</p>
<p>当N=3时的GRAY码为：000，001，011，010，110，111，101，100；</p>
<p>从上面的简单情形可以看出G（n）的构造规律：G（n+1）=0G(n)1G1(n);</p>
<p>其中G1（n）的第一个n位串相同，可用数学归纳法证明G（n）的上述构造规律。</p>
<p>由此规律容易设计构造G（n）的分治法如下：</p>
<p>#include&lt;iostream&gt;<br>using namespace std;<br>const int maxn=100;<br>int a[maxn];<br>void gray(int n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; if(n==1){a[1]=0;a[2]=1;return;}<br>&nbsp;&nbsp;&nbsp;&nbsp; gray(n-1);<br>&nbsp;&nbsp;&nbsp;&nbsp; for(int k=1&lt;&lt;(n-1),i=k;i&gt;0;i--)a[2*k-i+1]=a[i]+k;<br>&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>}<br>void out(int n)<br>{<br>char str[32];<br>int m=1&lt;&lt;n;<br>for(int i=1;i&lt;=m;i++)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; itoa(a[i],str,2);//把a[i]转换成2进制的字符串在传给str;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // cout&lt;&lt;str&lt;&lt;" ";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int s=strlen(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;n-s;j++)cout&lt;&lt;"0";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;str&lt;&lt;" ";<br>}<br>cout&lt;&lt;endl;&nbsp;&nbsp;&nbsp; <br>}<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int n;<br>&nbsp;&nbsp;&nbsp; while(cin&gt;&gt;n)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; int b=1&lt;&lt;n-1;<br>&nbsp;&nbsp;&nbsp; // cout&lt;&lt;b&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gray(n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out(n);<br>&nbsp;&nbsp;&nbsp; }<br></p>
</div>
<img src ="http://www.cppblog.com/HenDanTou/aggbug/104237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/HenDanTou/" target="_blank">HenDanTou</a> 2009-12-27 23:38 <a href="http://www.cppblog.com/HenDanTou/articles/104237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>