免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: loveguohuasai
打印 上一主题 下一主题

[算法] 母牛数量算法 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
71 [报告]
发表于 2003-08-07 13:11 |只看该作者

母牛数量算法

已经加上了释放内存的那一段了。

论坛徽章:
0
72 [报告]
发表于 2003-08-07 13:46 |只看该作者

母牛数量算法

我用vector重新实现flw的算法,正好考验一下stl的健壮性。

  1. #include<iostream>;
  2. #include<vector>;

  3. using namespace std;

  4. class Cow;
  5. vector< class Cow *>; ver;

  6. class Cow {
  7.     int age;
  8. public:
  9.     Cow():age(0) {}
  10.     void grow(void) {
  11.       age++;                // 每年长了一岁。
  12.       if ( age >;= 4 ) {     // 第四个年头起生小牛。
  13.          ver.push_back(new Cow);
  14.       }
  15.    }
  16. };

  17. int main()
  18. {
  19.    int years = 40;  
  20.    ver.push_back(new Cow);
  21.    for( int i=0; i<years; i++ )
  22.       for( int j=0; j<ver.size(); j++)
  23.             ver[j]->;grow();
  24.    //输出结果
  25.    cout<<ver.size()<<endl;
  26.    //释放内存
  27.    for(int i=0; i<ver.size(); i++)
  28.       delete ver[i];
  29. }
复制代码

算到years=40时,出来的结果是1822473。计算years=50时就狂读硬盘了,所有我没有继续。由此看来stl的容器能够支持的元素个数是很大的,但不知道最大是多少,什么时候能溢出?

论坛徽章:
0
73 [报告]
发表于 2003-08-07 16:50 |只看该作者

母牛数量算法

我也做了一个:

  1. #include <stdlib.h>;
  2. #include <stdio.h>;

  3. #define MAX_STRING_LEN                128

  4. static void Add(const char *, const char *, char *);

  5. int main(int argc, char **argv)
  6. {
  7.         char        szCowCount[MAX_STRING_LEN];
  8.         char        szLastCount3[MAX_STRING_LEN];
  9.         char        szCount3[MAX_STRING_LEN];
  10.         char        szCount2[MAX_STRING_LEN];
  11.         char        szCount1[MAX_STRING_LEN];
  12.         int                iYears;
  13.         int                i;
  14.        
  15.         iYears = atoi(argv[1]);
  16.         for (i = 1; i <= iYears; ++i)
  17.         {
  18.                 switch(i)
  19.                 {
  20.                         case 1:
  21.                         case 2:
  22.                         case 3:
  23.                                 strcpy(szCowCount, "1");
  24.                         break;
  25.                         case 4:
  26.                                 strcpy(szCowCount, "2");
  27.                         break;
  28.                         case 5:
  29.                                 strcpy(szCowCount, "3");
  30.                                 strcpy(szCount3, "1");
  31.                                 strcpy(szCount2, "1");
  32.                                 strcpy(szCount1, "1");
  33.                         break;
  34.                         default:
  35.                                 if (strlen(szCowCount) >;= MAX_STRING_LEN)
  36.                                         goto OUT;
  37.                                 strcpy(szLastCount3, szCount3);
  38.                                 Add(szCowCount, szCount3, szCowCount);
  39.                                 //szCowCount = szLastCowCount + szCount3;
  40.                                 Add(szCount3, szCount2, szCount3);
  41.                                 //szCount3 += szCount2;
  42.                                 strcpy(szCount2, szCount1);
  43.                                 strcpy(szCount1, szLastCount3);
  44.                         break;
  45.                 }
  46.         }
  47. OUT:       
  48.         printf("Yead:[%d]; Cow number:[%s].\n", iYears, szCowCount);
  49. }



  50. //
  51. //  字符串数据相加.
  52. //
  53. static void Add(const char *pcFirst, const char *pcSecond, char *pcAdd)
  54. {
  55.         char        szFirstAdd[MAX_STRING_LEN];
  56.         char        szAdd[MAX_STRING_LEN];
  57.         int                i;
  58.         int                iFirst;
  59.         int                iSecond;
  60.         int                iAdd;
  61.         int                iFirstLen;
  62.         int                iSecondLen;
  63.         int                iMinLen;
  64.         int                iOver = 0;
  65.         int                n;
  66.        
  67.         iFirstLen = strlen(pcFirst);
  68.         iSecondLen = strlen(pcSecond);
  69.         if (iFirstLen < iSecondLen)
  70.                 iMinLen = iFirstLen;
  71.         else
  72.                 iMinLen = iSecondLen;
  73.         for (i = 0; i < iMinLen; ++i)
  74.         {
  75.                 szFirstAdd[i] = pcFirst[iFirstLen - i - 1] - 48 + pcSecond[iSecondLen - i - 1] + iOver;

  76.                 if (szFirstAdd[i] - 48 >;= 10)
  77.                 {
  78.                         szFirstAdd[i] = (szFirstAdd[i] - 48) % 10 + 48;
  79.                         iOver = 1;
  80.                 }
  81.                 else
  82.                         iOver = 0;
  83.         }
  84.         if (iFirstLen >; iMinLen)
  85.         {
  86.                 for (; i < iFirstLen; ++i)
  87.                 {
  88.                         szFirstAdd[i] = pcFirst[iFirstLen - i - 1] + iOver;
  89.                 if (szFirstAdd[i] - 48 >;= 10)
  90.                 {
  91.                         szFirstAdd[i] = (szFirstAdd[i] - 48) % 10 + 48;
  92.                         iOver = 1;
  93.                 }
  94.                 else
  95.                         iOver = 0;
  96.                 }
  97.         }
  98.         else
  99.         {
  100.                 for (; i < iSecondLen; ++i)
  101.                 {
  102.                         szFirstAdd[i] = pcSecond[iSecondLen - i - 1] + iOver;
  103.                 if (szFirstAdd[i] - 48 >;= 10)
  104.                 {
  105.                         szFirstAdd[i] = (szFirstAdd[i] - 48) % 10 + 48;
  106.                         iOver = 1;
  107.                 }
  108.                 else
  109.                         iOver = 0;
  110.                 }
  111.         }
  112.         if (iOver == 1)
  113.                 szFirstAdd[i++] = '1';
  114.        
  115.         for (n = 0; n < i; ++n)
  116.                 szAdd[i - n - 1] = szFirstAdd[n];
  117.         szAdd[i] = '\0';
  118.         strcpy(pcAdd, szAdd);
  119.        
  120.         return;
  121. }
复制代码

测试了几个跟flw兄的结果一致,不知道数字大了会不会错,请各位测试一下!
要是没有问题的话下次来讨论算法!!!

论坛徽章:
0
74 [报告]
发表于 2003-08-07 19:41 |只看该作者

母牛数量算法

强,不过years只能算到767,768以上出来的数字全都一样。

论坛徽章:
0
75 [报告]
发表于 2003-08-07 19:47 |只看该作者

母牛数量算法

有没有注意,程序最后占了多少内存呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
76 [报告]
发表于 2003-08-07 21:02 |只看该作者

母牛数量算法

这个版好久没这么热闹了。
一天没来,这么多code了,偶分析不过来了,太面了,落下了,来叫声好。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
77 [报告]
发表于 2003-08-07 22:46 |只看该作者

母牛数量算法

看了后来的,又评论了一点,臭屁一下。

flw的算法的确是非常新颖,想法也非常的有创意。

但是,偶还是觉得不如偶的非递归算法好(嘻嘻)。

flw的算法中为每头牛创建了一个节点,异常庞大的内存消耗自不必说,偶觉得创建节点的开销也是蛮大的,因为毕竟不是原有的数据类型。在者,在每一年的循环中都要历遍一次链表,这个也是不小的一笔时间开销吧?

当然,这个用链表的想法应该是这个帖子里最有创意的想法了吧,版主到底是版主。

HopeCao的想法也很好,用字符串代替原有的数据类型以拓展可以求解的空间,可以计算到700多,想法非常好。

论坛徽章:
0
78 [报告]
发表于 2003-08-07 23:54 |只看该作者

母牛数量算法

我模仿flw老大的C++版,做了一个java版本,给大家找找乐,有兴趣请看:  
   http://www.chinaunix.net/forum/viewtopic.php?p=882955#882955     

还有,flw老大,你的code还有小问题,释放内存那段,ptr没有声明过吧。应改为Cow *ptr = cow::head;

论坛徽章:
0
79 [报告]
发表于 2003-08-08 02:31 |只看该作者

母牛数量算法

一头牛,引来兄弟无数呀
哈哈哈哈哈哈哈哈:)

论坛徽章:
0
80 [报告]
发表于 2003-08-08 02:44 |只看该作者

母牛数量算法

原帖由 "海滨" 发表:
一头牛,引来兄弟无数呀
哈哈哈哈哈哈哈哈:)
   

不不,关键是“母”牛。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP