<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>算法类</title><link>http://blog.vckbase.com/iwaswzq/category/360.html</link><description>主要收集各类算法的代码</description><managingEditor>九月鹰飞</managingEditor><dc:language>af</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>九月鹰飞</dc:creator><title>求多边形面积的简单方法</title><link>http://blog.vckbase.com/iwaswzq/archive/2007/01/10/23949.html</link><pubDate>Wed, 10 Jan 2007 04:53:00 GMT</pubDate><guid>http://blog.vckbase.com/iwaswzq/archive/2007/01/10/23949.html</guid><wfw:comment>http://blog.vckbase.com/iwaswzq/comments/23949.html</wfw:comment><comments>http://blog.vckbase.com/iwaswzq/archive/2007/01/10/23949.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blog.vckbase.com/iwaswzq/comments/commentRss/23949.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/iwaswzq/services/trackbacks/23949.html</trackback:ping><description>&lt;P&gt;&amp;lt;PRE&amp;gt;&lt;BR&gt;不论凸多边形还是凹多边形，都可以采用向量叉乘的方法来求面积。代码如下&lt;BR&gt;#include "stdafx.h"&lt;BR&gt;#include "stdio.h"&lt;BR&gt;typedef struct tagPoint&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;double x;&lt;BR&gt;&amp;nbsp;double y;&lt;BR&gt;}FPoint;&lt;BR&gt;double MianJi(FPoint *pArray,int NumPoint)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;if(NumPoint&amp;lt;3)return 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;double sum = 0;&lt;BR&gt;&amp;nbsp;int m = 1;&lt;BR&gt;&amp;nbsp;for(;;)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(NumPoint &amp;lt; 3)break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;FPoint r1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;r1.x = pArray[m].x - pArray[0].x;&lt;BR&gt;&amp;nbsp;&amp;nbsp;r1.y = pArray[m].y - pArray[0].y;&lt;BR&gt;&amp;nbsp;&amp;nbsp;FPoint r2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;r2.x = pArray[m+1].x - pArray[m].x;&lt;BR&gt;&amp;nbsp;&amp;nbsp;r2.y = pArray[m+1].y - pArray[m].y;&lt;BR&gt;&amp;nbsp;&amp;nbsp;sum += (r1.x * r2.y - r2.x * r1.y);&lt;BR&gt;&amp;nbsp;&amp;nbsp;m++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;NumPoint --;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;double result = (sum&amp;gt;0)?(sum/2.):(-sum/2.);&lt;BR&gt;&amp;nbsp;return result;&lt;BR&gt;}&lt;BR&gt;//test&lt;BR&gt;void main()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;FPoint pArray1[4]={{1,1},{1,2},{2,2},{2,1}};&lt;BR&gt;&amp;nbsp;FPoint pArray2[5]={{0,0},{0,2},{2,2},{1,1},{2,0}};&lt;BR&gt;&amp;nbsp;FPoint pArray3[9]={{0,0},{2,0},{2,1},{0,1},{0,2},{-2,0},{-1,0},{-1,-1},{0,-1}};&lt;BR&gt;&amp;nbsp;printf("Area1 = %f\n",MianJi(pArray1,4));&lt;BR&gt;&amp;nbsp;printf("Area2 = %f\n",MianJi(pArray2,5));&lt;BR&gt;&amp;nbsp;printf("Area3 = %f\n",MianJi(pArray3,9));&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;iwaswzq 2007/1/10&lt;BR&gt;&lt;BR&gt;&amp;lt;/PRE&amp;gt;&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/iwaswzq/aggbug/23949.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>九月鹰飞</dc:creator><title>关于f(n)=n的我的算法</title><link>http://blog.vckbase.com/iwaswzq/archive/2005/12/03/15587.html</link><pubDate>Sat, 03 Dec 2005 09:02:00 GMT</pubDate><guid>http://blog.vckbase.com/iwaswzq/archive/2005/12/03/15587.html</guid><wfw:comment>http://blog.vckbase.com/iwaswzq/comments/15587.html</wfw:comment><comments>http://blog.vckbase.com/iwaswzq/archive/2005/12/03/15587.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.vckbase.com/iwaswzq/comments/commentRss/15587.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/iwaswzq/services/trackbacks/15587.html</trackback:ping><description>&lt;P&gt;&lt;BR&gt;上次看到星星贴的一道面试题，觉得有点意思，自己也作了一下。&lt;/P&gt;
&lt;P&gt;题目：&lt;BR&gt;有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)=6,现在f(1)=1,问下一个最大的f(n)=n的n是什么？&lt;/P&gt;
&lt;P&gt;算法1。大家自然想到一个最简单的算法如下：&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #a9a9a9" color=#000080&gt;#include "stdafx.h"&lt;BR&gt;#include "stdio.h"&lt;BR&gt;#include &amp;lt;windows.h&amp;gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #a9a9a9" color=#000080&gt;//统计一个数字中1的个数&lt;BR&gt;int NumberofOne(int num)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;int result = 0;&lt;BR&gt;&amp;nbsp;while(num&amp;gt;0)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;int r = num%10;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(r == 1) result++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;num /= 10;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;return result;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #a9a9a9" color=#000080&gt;int main()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;int sum = 0;&lt;BR&gt;&amp;nbsp;for(int i=0;i&amp;lt;4000000000;i++)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;sum += NumberofOne(i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(sum == i)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("f(%d) = %d\n",i,sum);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;算法虽然很简单，但是效率太差，应该考虑优化算法，提高计算结果的速度。后来一个网友发布了另一个代码。&lt;/P&gt;
&lt;P&gt;算法二：来自&lt;A href="http://blog.csdn.net/psyl/archive/2005/11/29/539103.aspx"&gt;http://blog.csdn.net/psyl/archive/2005/11/29/539103.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;他用的是剪枝算法，速度还可以，本机测试运算到40亿的话，用了32ms&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;#include "stdafx.h"&lt;BR&gt;#include "stdio.h"&lt;BR&gt;#include &amp;lt;windows.h&amp;gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;int gTable[10]; &lt;BR&gt;const unsigned int gMAX = 4000000000L; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;int f(int n) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;int ret = 0; &lt;BR&gt;&amp;nbsp;int ntemp=n; &lt;BR&gt;&amp;nbsp;int ntemp2=1; &lt;BR&gt;&amp;nbsp;int i=1; &lt;BR&gt;&amp;nbsp;while(ntemp) &lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;ret += (((ntemp-1)/10)+1) * i; &lt;BR&gt;&amp;nbsp;&amp;nbsp;if( (ntemp%10) == 1 ) &lt;BR&gt;&amp;nbsp;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret -= i; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret += ntemp2; &lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;ntemp = ntemp/10; &lt;BR&gt;&amp;nbsp;&amp;nbsp;i*=10; &lt;BR&gt;&amp;nbsp;&amp;nbsp;ntemp2 = n%i+1; &lt;BR&gt;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;return ret; &lt;BR&gt;} &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;int count1(int n) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;int count = 0; &lt;BR&gt;&amp;nbsp;while(n) &lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;if( (n%10) == 1) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;++count; &lt;BR&gt;&amp;nbsp;&amp;nbsp;n /= 10; &lt;BR&gt;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;return count; &lt;BR&gt;} &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;int cal(unsigned int number,int nwei,int count1,unsigned int ncount) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;int i,n=1; &lt;BR&gt;&amp;nbsp;unsigned int maxcount; &lt;BR&gt;&amp;nbsp;if(nwei==0) &lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;ncount += count1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;if(number == ncount) &lt;BR&gt;&amp;nbsp;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("f(%d) = %d \n",number,number); &lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;return ncount; &lt;BR&gt;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;for(i=0;i&amp;lt;nwei;++i) &lt;BR&gt;&amp;nbsp;&amp;nbsp;n *= 10; &lt;BR&gt;&amp;nbsp;maxcount = ncount + gTable[nwei-1]; &lt;BR&gt;&amp;nbsp;maxcount += count1*n; &lt;BR&gt;&amp;nbsp;if(ncount &amp;gt; (number + (n-1)) ) &lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;return maxcount; &lt;BR&gt;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;if(maxcount &amp;lt; number) &lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;return maxcount; &lt;BR&gt;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;n /= 10; &lt;BR&gt;&amp;nbsp;for(i=0;i&amp;lt;10;++i) &lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;if(i==1) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ncount = cal(number+i*n,nwei-1,count1+1,ncount); &lt;BR&gt;&amp;nbsp;&amp;nbsp;else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ncount = cal(number+i*n,nwei-1,count1,ncount); &lt;BR&gt;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;return ncount; &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;int main(int argc, char* argv[]) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;int i; &lt;BR&gt;&amp;nbsp;unsigned int n=1; &lt;BR&gt;&amp;nbsp;unsigned int ncount = 0; &lt;BR&gt;&amp;nbsp;int nwei = 0; &lt;BR&gt;&amp;nbsp;int ncount1; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;int beginTime=GetTickCount(); &lt;BR&gt;&amp;nbsp;//init gTable &lt;BR&gt;&amp;nbsp;for(i=0;i&amp;lt;10;++i) &lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;n *= 10; &lt;BR&gt;&amp;nbsp;&amp;nbsp;gTable[i] = f(n-1); &lt;BR&gt;&amp;nbsp;} &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;n=0; &lt;BR&gt;&amp;nbsp;nwei = 0; &lt;BR&gt;&amp;nbsp;ncount1 = 0; &lt;BR&gt;&amp;nbsp;while(n&amp;lt;gMAX) &lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;unsigned int temp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;temp = 1; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;ncount =cal(n,nwei,ncount1,ncount); &lt;BR&gt;&amp;nbsp;&amp;nbsp;for(i=0;i&amp;lt;nwei;++i) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp *= 10; &lt;BR&gt;&amp;nbsp;&amp;nbsp;n += temp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;if( (n/temp)/10 == 1) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;++nwei; &lt;BR&gt;&amp;nbsp;&amp;nbsp;ncount1 = count1(n); &lt;BR&gt;&amp;nbsp;} &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;int endTime=GetTickCount(); &lt;BR&gt;&amp;nbsp;endTime-=beginTime; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;printf("time: %d ms\n",endTime); &lt;BR&gt;&amp;nbsp;return 0; &lt;BR&gt;} &lt;BR&gt;&lt;/FONT&gt;因为没有说明，没有仔细研究这个算法。&lt;/P&gt;
&lt;P&gt;算法三：这是我的算法。加速变量和优化一起做。基于以下考虑：&lt;/P&gt;
&lt;P&gt;1、两个函数i和f(i)都是单增函数，故有：&lt;/P&gt;
&lt;P&gt;1、计算n位最大数的f值，例如f(9) = 1; f(99) = 20; f(999) = 300, 自然有：&lt;BR&gt;&amp;nbsp;&amp;nbsp; 如果i是n位数字，而且i&amp;gt;f(999..9) ,则可以跳过后面的计算，例如当i&amp;gt;300的时候，可以忽略f(301) 至f(999)。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; 我称以上优化为后段优化&lt;/P&gt;
&lt;P&gt;2、计算i和f(i)之间的差值。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 假设：diff = i - f(i); &lt;BR&gt;&amp;nbsp;&amp;nbsp; （1）如果diff&amp;gt;0，说明f(i) &amp;lt; i。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 考虑f(i)的增长速度：显然此时f(i)的增加速度&amp;lt;=i的位数。例如i是二位数，f(20) = 11; 差值diff = 20-11 = 9;至少i要增加9/2=4次，&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f(i)才有可能追上i的增长。因此可以直接计算f(20+4);&lt;BR&gt;&amp;nbsp;&amp;nbsp; （2）如果diff&amp;lt;0, 说明f(i) &amp;gt; i。显然i至少要增长 -diff才有可能追上f(i)。例如f(1622581) = 1642401; &lt;BR&gt;差值diff =&amp;nbsp;1622581 -&amp;nbsp;1642401 = -19820;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以直接考虑计算f(1622581 + 19820),也就是计算f(1642401)即可。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我称以上优化为前段优化&lt;/P&gt;
&lt;P&gt;综合以上两点，写出如下算法：&lt;BR&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;#include "stdafx.h"&lt;BR&gt;#include "stdio.h"&lt;BR&gt;#include &amp;lt;windows.h&amp;gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;//计算从1到num的1的个数&lt;BR&gt;UINT NumberOneBelow(UINT num)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;UINT mod = 1;&lt;BR&gt;&amp;nbsp;UINT add = 0;&lt;BR&gt;&amp;nbsp;UINT result = 0;&lt;BR&gt;&amp;nbsp;while(num&amp;gt;0)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;UINT chu = num/10;&lt;BR&gt;&amp;nbsp;&amp;nbsp;UINT yu&amp;nbsp; = num%10;&lt;BR&gt;&amp;nbsp;&amp;nbsp;result += chu * mod;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(yu &amp;gt; 1) result += mod;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(yu ==1) result += (add+1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;add += yu * mod;&lt;BR&gt;&amp;nbsp;&amp;nbsp;mod *= 10;&lt;BR&gt;&amp;nbsp;&amp;nbsp;num /= 10;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;return result;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;//计算n位数之内1的总数统计值，这里的num只考虑它的位数&lt;BR&gt;UINT Total(UINT num)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;UINT key = num;&lt;BR&gt;&amp;nbsp;UINT add = 1;&lt;BR&gt;&amp;nbsp;while(key&amp;gt;9)&lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;add*=10;&lt;BR&gt;&amp;nbsp;&amp;nbsp;key/=10;&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;if(num&amp;lt;10)return 1;&lt;BR&gt;&amp;nbsp;else return 10*Total(num/10)+add;&lt;BR&gt;}&lt;BR&gt;//计算num相关的最大值和位数。例如num是二位数，则max = 99, bit = 2&lt;BR&gt;void MaxAndBit(UINT num, UINT &amp;amp;max, UINT &amp;amp;bit)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;max = 9;&lt;BR&gt;&amp;nbsp;bit = 1;&lt;BR&gt;&amp;nbsp;while(num&amp;gt;9)&lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;num/=10;&lt;BR&gt;&amp;nbsp;&amp;nbsp;max*=10; max+=9;&lt;BR&gt;&amp;nbsp;&amp;nbsp;bit++;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;return ;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;int main()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;UINT max, bit;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;UINT TotalOnes = Total(1);&lt;BR&gt;&amp;nbsp;MaxAndBit(1,max,bit);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;int beginTime=GetTickCount(); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;for(UINT i=1;i&amp;lt;4000000000;i++)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;//如果i超过n位之内所有1的个数，则跳过后面的计算&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(i&amp;gt;TotalOnes)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;i = max; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;TotalOnes = Total(i+1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MaxAndBit(i+1,max,bit);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//超过最大整数表示范围，用固定数替换&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(TotalOnes&amp;gt;1000000000)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TotalOnes = 4000000000;&amp;nbsp; //实际上，应该是100亿&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;UINT one = NumberOneBelow(i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(one == i)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("f(%d)=%d\n",i,one);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//计算差值&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp; diff = i-one;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(diff &amp;gt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i+= diff/bit;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i = one-1;//下个循环i自动加1后，自动从one开始计算&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;int endTime=GetTickCount(); &lt;BR&gt;&amp;nbsp;endTime-=beginTime; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #d3d3d3" color=#0000ff&gt;&amp;nbsp;printf("time: %d ms\n",endTime); &lt;BR&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;计算到最后一个结果f(1111111110) = 1111111110; 所用时间在16 - 47毫秒之间。&lt;/P&gt;
&lt;P&gt;iwaswzq 2005/12/2&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/iwaswzq/aggbug/15587.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>九月鹰飞</dc:creator><title>也谈螺旋矩阵的生成</title><link>http://blog.vckbase.com/iwaswzq/archive/2004/12/14/2071.html</link><pubDate>Tue, 14 Dec 2004 15:28:00 GMT</pubDate><guid>http://blog.vckbase.com/iwaswzq/archive/2004/12/14/2071.html</guid><wfw:comment>http://blog.vckbase.com/iwaswzq/comments/2071.html</wfw:comment><comments>http://blog.vckbase.com/iwaswzq/archive/2004/12/14/2071.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.vckbase.com/iwaswzq/comments/commentRss/2071.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/iwaswzq/services/trackbacks/2071.html</trackback:ping><description>&lt;img src ="http://blog.vckbase.com/iwaswzq/aggbug/2071.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>九月鹰飞</dc:creator><title>采用部分主元法求方阵A逆矩阵的C代码</title><link>http://blog.vckbase.com/iwaswzq/archive/2004/11/23/1664.html</link><pubDate>Mon, 22 Nov 2004 20:23:00 GMT</pubDate><guid>http://blog.vckbase.com/iwaswzq/archive/2004/11/23/1664.html</guid><wfw:comment>http://blog.vckbase.com/iwaswzq/comments/1664.html</wfw:comment><comments>http://blog.vckbase.com/iwaswzq/archive/2004/11/23/1664.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.vckbase.com/iwaswzq/comments/commentRss/1664.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/iwaswzq/services/trackbacks/1664.html</trackback:ping><description>&lt;img src ="http://blog.vckbase.com/iwaswzq/aggbug/1664.html" width = "1" height = "1" /&gt;</description></item></channel></rss>