﻿<?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++博客-广交天下ACM爱好者-文章分类-Math Theory</title><link>http://www.cppblog.com/goAheadtw/category/15894.html</link><description>haha</description><language>zh-cn</language><lastBuildDate>Wed, 19 Jan 2011 03:26:48 GMT</lastBuildDate><pubDate>Wed, 19 Jan 2011 03:26:48 GMT</pubDate><ttl>60</ttl><item><title>齐肯多夫定理</title><link>http://www.cppblog.com/goAheadtw/articles/138755.html</link><dc:creator>tw</dc:creator><author>tw</author><pubDate>Tue, 18 Jan 2011 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/goAheadtw/articles/138755.html</guid><wfw:comment>http://www.cppblog.com/goAheadtw/comments/138755.html</wfw:comment><comments>http://www.cppblog.com/goAheadtw/articles/138755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/goAheadtw/comments/commentRss/138755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/goAheadtw/services/trackbacks/138755.html</trackback:ping><description><![CDATA[<p><span style="COLOR: #0000ff">/*<br>齐肯多夫定理表示任何正整数都可以表示成若干个不连续的斐波那契数之和。这种和式称为齐肯多夫表述法。<br>对于任何正整数，其齐肯多夫表述法都可以用贪心算法选出每回最大可能的斐波那契数。<br>*/ <br></span><span style="COLOR: red">#include &lt;stdio.h&gt;<br>#include &lt;memory&gt;<br>#include &lt;iostream&gt;<br>#include &lt;algorithm&gt;<br>#include &lt;cstring&gt;<br>#include &lt;vector&gt;<br>#include &lt;map&gt;<br>#include &lt;cmath&gt;<br>#include &lt;set&gt;<br>#include &lt;queue&gt;<br>#include &lt;time.h&gt; <br>#include &lt;limits&gt;<br>using namespace std;<br>#define ull unsigned long long<br>#define ll long long <br>#define N 100<br>ll fab[N], out[N];<br>int fn; <br>void init(){<br>&nbsp;int i; <br>&nbsp;ull inf = 0x7fffffffffffffff; <br>&nbsp;ull a; <br>&nbsp;fab[0] = 1; <br>&nbsp;fab[1] = 2; <br>&nbsp;for(i = 2; ; i++){<br>&nbsp;&nbsp;a = fab[i-1] + fab[i-2]; <br>&nbsp;&nbsp;if(a &gt; inf) break; <br>&nbsp;&nbsp;fab[i] = a; <br>&nbsp;}<br>&nbsp;fn = i; <br>}<br>int find(ll* fab, int l, int r, ll k){<br>&nbsp;int mid; <br>&nbsp;while(l &lt;= r){<br>&nbsp;&nbsp;mid = (l + r) &gt;&gt; 1; <br>&nbsp;&nbsp;if(fab[mid] &lt;= k) l = mid + 1; <br>&nbsp;&nbsp;else r = mid - 1; <br>&nbsp;}<br>&nbsp;return l - 1; <br>}<br>void Zeckendorf(ll a){<br>&nbsp;if(a &lt;= 0){<br>&nbsp;&nbsp;printf("%lld=%lld\n", a, a);<br>&nbsp;&nbsp;return; <br>&nbsp;}<br>&nbsp;ll a0 = a; <br>&nbsp;int k = 0, i; <br>&nbsp;while(a0 &gt; 0){<br>&nbsp;&nbsp;i = find(fab, 0, fn - 1, a0); <br>&nbsp;&nbsp;out[k++] = fab[i]; <br>&nbsp;&nbsp;a0 -= fab[i]; <br>&nbsp;}<br>&nbsp;printf("%lld=", a);<br>&nbsp;for(i = 0; i &lt; k-1; i++) printf("%lld+", out[i]);<br>&nbsp;printf("%lld\n", out[i]);<br>}<br>int main(){<br>#ifndef ONLINE_JUDGE<br>&nbsp;//freopen("in.txt", "r", stdin); <br>&nbsp;//freopen("out.txt", "w", stdout); <br>#endif&nbsp; <br>&nbsp;init(); <br>&nbsp;ll a; <br>&nbsp;while(~scanf("%lld", &amp;a)){<br>&nbsp;&nbsp;Zeckendorf(a); <br>&nbsp;}<br>&nbsp;return 0;<br>}</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/goAheadtw/aggbug/138755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/goAheadtw/" target="_blank">tw</a> 2011-01-18 15:42 <a href="http://www.cppblog.com/goAheadtw/articles/138755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>