﻿<?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>BlogJava-沐雨林的晨曦-随笔分类-C++&amp;C</title><link>http://www.blogjava.net/murainwood/category/10159.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:30:36 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:30:36 GMT</pubDate><ttl>60</ttl><item><title>算法求解</title><link>http://www.blogjava.net/murainwood/archive/2006/10/15/75287.html</link><dc:creator>murainwood</dc:creator><author>murainwood</author><pubDate>Sun, 15 Oct 2006 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/murainwood/archive/2006/10/15/75287.html</guid><wfw:comment>http://www.blogjava.net/murainwood/comments/75287.html</wfw:comment><comments>http://www.blogjava.net/murainwood/archive/2006/10/15/75287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/murainwood/comments/commentRss/75287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/murainwood/services/trackbacks/75287.html</trackback:ping><description><![CDATA[
		<p>编程求解: 运动员打靶,10发子弹命中90环(每分成绩为0到10环不等)<br />                 求可能情况的总数<br /><br />解法一:<br /> #include &lt;stdio.h&gt; <br />#include &lt;stdlib.h&gt; </p>
		<p>int f(int n, int m) <br />{ <br /> int fn=0,i; <br /> if(m&lt;0||m&gt;10*n) return 0; <br /> if(n==1) return 1; <br /> for(i=0;i&lt;=10;i++) <br /> fn+=f(n-1,m-i); <br /> return fn; <br />} </p>
		<p>
				<br />int main() <br />{ <br /> int n,m; <br /> printf("Please enter n and m:"); <br /> scanf("%d%d",&amp;n,&amp;m); <br /> printf("\n%d发打中%d环有%d种可能.\n",n,m,f(n,m)); </p>
		<p> system("PAUSE"); <br /> return 0; <br />} <br /><br />解法二:<br /><br /> #include"stdio.h"</p>
		<p>int main(){</p>
		<p>int num =1,i; <br />for(i=1;i&lt;=10;i++) <br />num = num *(9+i)/i; <br />printf("%d",num);<br />}<br /><br />个人观点:<br />  计算机是一门和数学相关的学科,随着这门学科的发展,这种"本质"似乎被弱化了.解法1是很普通的方法,一般人都是这种思路.而解法二则是从数学角度考虑.简洁,快速.<br />上次去神码笔试,碰到一题<br />   :给定一个数,如7899,把各位数值相加7+8+9+9=33,3+3=6,用这种方法计算机下去,求最后得到的个位数<br /><br />我给出的解法:<br />#include "stdio.h"<br /><br />int main(){<br />   int i;<br />   scanf("%d",&amp;i);<br />   printf("%d",i%9==0?9:i%9);<br />   return 0<br />}//~end <br /> </p>
<img src ="http://www.blogjava.net/murainwood/aggbug/75287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/murainwood/" target="_blank">murainwood</a> 2006-10-15 18:15 <a href="http://www.blogjava.net/murainwood/archive/2006/10/15/75287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么叫艺术？代码也是种艺术</title><link>http://www.blogjava.net/murainwood/archive/2006/09/26/71874.html</link><dc:creator>murainwood</dc:creator><author>murainwood</author><pubDate>Mon, 25 Sep 2006 19:57:00 GMT</pubDate><guid>http://www.blogjava.net/murainwood/archive/2006/09/26/71874.html</guid><wfw:comment>http://www.blogjava.net/murainwood/comments/71874.html</wfw:comment><comments>http://www.blogjava.net/murainwood/archive/2006/09/26/71874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/murainwood/comments/commentRss/71874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/murainwood/services/trackbacks/71874.html</trackback:ping><description><![CDATA[华为笔试题：计算字符串“010111001100....”中‘0’和‘1’连续出现的次数。<br /><br />#include&lt;iostream&gt;;<br /><br />void main() {<br /><br />   char *charArray="01000111100011100111100001";<br />   int max[2]    ={0,0};<br />   int count[2]  ={0,0};<br /><br />  while(*charArray){<br />      <br />  int   index     =*charArray-'0';<br /><br />  count[index]++;<br />  count[index^1] =0;<br /><br />  if(count[index]&gt;max[index])<br />        max[index]=count[index];<br /><br />  charArray++;<br />  }<br /> <br /> std:cout&lt;&lt;"Max times of 0 is"&lt;&lt;max[0]&lt;&lt;std:endl;<br /> std:cout&lt;&lt;"Max times of 1 is"&lt;&lt;max[1]&lt;&lt;std:endl;<br />}<br />//~:end the codes<br /><br />程序代码的艺术化，呵呵<img src ="http://www.blogjava.net/murainwood/aggbug/71874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/murainwood/" target="_blank">murainwood</a> 2006-09-26 03:57 <a href="http://www.blogjava.net/murainwood/archive/2006/09/26/71874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建STL风格的Ring List解决约瑟夫问题</title><link>http://www.blogjava.net/murainwood/archive/2006/04/18/41541.html</link><dc:creator>murainwood</dc:creator><author>murainwood</author><pubDate>Mon, 17 Apr 2006 16:10:00 GMT</pubDate><guid>http://www.blogjava.net/murainwood/archive/2006/04/18/41541.html</guid><wfw:comment>http://www.blogjava.net/murainwood/comments/41541.html</wfw:comment><comments>http://www.blogjava.net/murainwood/archive/2006/04/18/41541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/murainwood/comments/commentRss/41541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/murainwood/services/trackbacks/41541.html</trackback:ping><description><![CDATA[
		<p>     很经典的"转圈数数踢人"问题,老早以前做的东西<br />     这里是我的解法,利用STL里的List构建Ring List<br />     头文件:<br />  //:This part is partly from Bruce Eckel's source code .<br />// thought he don't hear of me at all ^_^<br />// Making a "ring" data structure from the STL <br />#ifndef RING_H<br />#define RING_H</p>
		<p>#include&lt;iterator&gt;<br />#include&lt;list&gt;<br />using namespace std;</p>
		<p>template &lt;class Type&gt; class Ring{<br /> list&lt;Type&gt; lst;<br />public:</p>
		<p>
				<br /> class iterator;<br /> friend class iterator;<br /> class iterator :public std::iterator&lt;std::bidirectional_iterator_tag,Type,ptrdiff_t&gt;{<br />  typename list&lt;Type&gt;::iterator it;<br />  list&lt;Type&gt;* r;</p>
		<p> public:<br />  iterator(list&lt;Type&gt;&amp;lst,const typename list&lt;Type&gt;::iterator&amp; i):it(i),r(&amp;lst){}</p>
		<p>  bool operator==(const iterator&amp; x)const{<br />   return it==x.it;<br />  }</p>
		<p>  bool operator!=(const iterator&amp; x)const{<br />   return!(*this==x);<br />  }</p>
		<p>  typename list&lt;Type&gt;::reference operator*()const{<br />   return *it;<br />  }</p>
		<p>  iterator&amp; operator++(){<br />   ++it;<br />   if(it==r-&gt;end())<br />    it=r-&gt;begin();<br />   return *this;<br />  }</p>
		<p>  iterator operator++(int){<br />   iterator tmp=*this;<br />   ++*this;<br />   return tmp;<br />  }</p>
		<p>  iterator &amp;operator--(){<br />   if(it==r-&gt;begin())<br />    it=r-&gt;end();<br />   --it;<br />   return *this;<br />  }<br />  iterator operator--(int){<br />   iterator tmp=*this;<br />   --*this;<br />   return tmp;<br />  }</p>
		<p>  iterator insert(const Type&amp; x){<br />   return iterator(*r,r-&gt;insert(it,x));<br />  }<br />  <br />  //I have to recognize that the iterator is not so smart as <br />  //we expected .If the element in the list is erased ,the <br />  //iterator will be lost and point to a null.The shortage of <br />  //the stupid iterator will been seen the the Josephus.cpp <br />  //we have to use a template variable to storage the next iterator <br />  //of the deleting iterator.If not ,the programe will be nightmare <br />  iterator erase(){<br />   return iterator(*r,r-&gt;erase(it));<br />  }</p>
		<p> };</p>
		<p> void push_back(const Type&amp; x){lst.push_back(x);}</p>
		<p> iterator begin(){return iterator(lst,lst.begin());}</p>
		<p> int size(){return lst.size();}</p>
		<p>};<br />#endif<br /><br />实现文件:<br />//:Using circle list to solve Josephus problem <br />//:version 1.01<br />//:author Murainwood 12/3/2006<br />#include&lt;iostream&gt;<br />#include"Ring.h"</p>
		<p>void  main(){</p>
		<p> //enter the number of people and the index </p>
		<p> int n,m;<br /> cout&lt;&lt;"Enter the Number of Contestants?";<br /> cin&gt;&gt;n&gt;&gt;m;<br />    <br /> <br />    Ring&lt;int&gt; ring;<br /> for(int i=1;i&lt;=n;i++) ring.push_back(i);</p>
		<p> //determine the iterator <br /> //it is reasonable  to declare two iterator </p>
		<p>    Ring&lt;int&gt;::iterator tmp=ring.begin();<br /> Ring&lt;int&gt;::iterator it=tmp;<br /> <br /> //without the iterator tmp ,if we erase the it <br /> //the it will lost ,so the loop can not  work </p>
		<p> for(int index=0;index&lt;n-1;index++){<br />   it=tmp;<br />  for(int j=0;j&lt;m-1;j++){it++;tmp++;}<br />   tmp++;<br />      cout&lt;&lt;"Delete person"&lt;&lt;*it&lt;&lt;endl;<br />   it.erase();<br />    <br /> }<br /> it=ring.begin();<br /> cout&lt;&lt;"The result is person"&lt;&lt;*it&lt;&lt;endl;<br />}</p>
		<p>//:finished <br /><br />     这个Ring List有很高的效率和安全性,并且通用性也比较好<br />     这里也发现个问题,就是STL里的Iterator 还不够"聪明",这也是为什么我会在程序里多加个迭代器:tmp,<br />因为如果我调用了it.erase();那么这个迭代器就丢失了,程序也就无非运行下去.<br />     这样我们很容易地想,如果调用了it.erase()后,指针不是丢失,而是指向下一个元素该多好啊!<br />     很遗憾,现阶段标准STL库里的List没有这个功能.猜想是因为List的物理存储结构的缘故,如果让他的迭代器变得如我们想像得那么"聪明",那么花费可能会有些大.<br />    还没有验证过boost库,不知道那里的迭代器是否会更人性化些<br />     有时间研究一下相关的STL源码,写一个"聪明些"的迭代器.</p>
<img src ="http://www.blogjava.net/murainwood/aggbug/41541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/murainwood/" target="_blank">murainwood</a> 2006-04-18 00:10 <a href="http://www.blogjava.net/murainwood/archive/2006/04/18/41541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>