免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 7133 | 回复: 33
打印 上一主题 下一主题

[C] 你认为哪个程序体现程序员的水平? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-19 18:26 |只看该作者 |倒序浏览
本帖最后由 晓得飞天千秋雪 于 2013-03-19 18:32 编辑

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

方法一:

#include <stdio.h>
int main(void)
{
    unsigned int sum[24] = {0};
    int i, j;
    sum[0] = 1;
    sum[1] = 1;
    printf("第1月:1对兔子\n");
    printf("第2月:1对兔子\n");
    for(i=2; i<24; i++)
    {
        sum[ i ] = sum[i-1] + sum[i-2];
        printf("第%d月:%d对兔子\n", i+1, sum[ i ]);
    }   
    return 0;
}

方法二:

#include <stdio.h>
#define MAXNUM 100000
int main(void)
{
  unsigned int RabID[MAXNUM] = {0};
  unsigned int RabNum = 0;
  int i, j;
  RabID[0] = 1;
  for(i=1; i<=24; i++) //统计24个月
  {
      for(j=0; j<MAXNUM; j++)
      {
          if(RabID[j] > 0) //该对兔子已出生         
         {
              if((i-RabID[j]+1) >= 3) //该对兔子出生满3个月
              {
                  RabNum = RabNum + 1; //又出生了一对兔子
                  RabID[RabNum] = i; //该对兔子是第i月出生
              }
          }
          else
          {
              printf("第%d月:%d对兔子\n", i, RabNum+1);
              break; //本月统计完毕
          }
      }
  }
  return 0;
}

你认为哪个程序体现程序员的水平?

参见:
http://kan.weibo.com/con/3557307221459937?_from=title
http://kan.weibo.com/con/3557481435831543?_from=image

论坛徽章:
0
2 [报告]
发表于 2013-03-19 20:35 |只看该作者
都不怎么样。

论坛徽章:
0
3 [报告]
发表于 2013-03-19 21:38 |只看该作者
回复 2# wlmouse

说出些原因理由,或给出个示例示范说明。诚求。


   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
4 [报告]
发表于 2013-03-20 05:10 |只看该作者
谁告诉你只统计两年的?

假设是魔鬼。

论坛徽章:
0
5 [报告]
发表于 2013-03-20 07:07 来自手机 |只看该作者
相对而言,第一个好些。稍微改改可以更好。第二个的逻辑……

论坛徽章:
0
6 [报告]
发表于 2013-03-20 09:10 |只看该作者
我一会儿写一个看看的。不过好久没写C程序了。

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-03-13 15:26:06CU大牛徽章
日期:2013-03-13 15:26:47
7 [报告]
发表于 2013-03-20 09:14 |只看该作者
很明显方法一非常棒。

它十分准确的实现了求数列A{n}=A{n-1} + A{n-2}, n>2时A{n}的值。  逻辑清晰,代码简洁。


方法二,没心情看,一大堆逻辑判断,却没抓住问题的基本数学原理。 可能答案是对的,但却比较丑陋。

论坛徽章:
0
8 [报告]
发表于 2013-03-20 09:26 |只看该作者
我先批评一下你贴出来的程序。
方法一:
头两个月的兔子是怎么回事?干嘛不干脆把所有24个月的兔子数量都这么打出来。还要计算干嘛。计算和打印写在了一起。算法和数据的存放也有问题,累计只能24个月,而且需要存那么多数据吗?。
方法二:
RabID[MAXNUM]太浪费了吧。算法连方法一都不如。同样的计算和打印职责混在一起。

论坛徽章:
0
9 [报告]
发表于 2013-03-20 10:29 |只看该作者
  1. /*
  2. ============================================================================
  3. Name        : hare.c
  4. Author      : Miao
  5. Version     :
  6. Copyright   : Your copyright notice
  7. Description : Hello World in C, Ansi-style
  8. ============================================================================
  9. */

  10. #include <stdio.h>
  11. #include <stdlib.h>

  12. //输入月数
  13. int input_month();

  14. //兔子总数
  15. int allHare(int new_hare, int young_hare, int hare);

  16. //计算一个月的兔子变化
  17. void computerHare(int *new_hare, int *young_hare, int *hare);

  18. //main函数
  19. int main(void) {
  20.         //设定初始成年兔子、年轻兔子、新生兔子
  21.         int hare = 0, young_hare = 0, new_hare = 0;
  22.         //月数
  23.         int month = input_month();
  24.         for (int i = 1;i<=month;i++) {
  25.                 computerHare(&new_hare, &young_hare, &hare);
  26.                 printf("第%d个月,目前共有兔子%d对\n", i, allHare(new_hare, young_hare, hare));
  27.         }
  28.         return EXIT_SUCCESS;
  29. }

  30. int input_month() {
  31.         int month = 0;
  32.         for(int result = 0; result == 0;) {
  33.                 fflush(stdin);
  34.                 printf("%s", "请问要统计多少个月后兔子的数量?");
  35.                 result = scanf("%d", &month);
  36.         }
  37.         return month;
  38. }

  39. int allHare(int new_hare, int young_hare, int hare) {
  40.         return new_hare + young_hare + hare;
  41. }

  42. void computerHare(int *new_hare, int *young_hare, int *hare) {
  43.         *hare += *young_hare;
  44.         *young_hare = *new_hare;
  45.         //如果目前没有兔子,则第一次购进1对兔子,反之则开始繁殖
  46.         *new_hare = allHare(*hare, *young_hare, *new_hare) > 0 ? *hare : 1;
  47. }
复制代码
写完了。不过C语言也就是入门等级,可能写得不好。

论坛徽章:
0
10 [报告]
发表于 2013-03-20 10:30 |只看该作者
本帖最后由 晓得飞天千秋雪 于 2013-03-20 10:36 编辑

总结下大家的意见:
(1) 编程是有约束条件的,“问每个月的兔子总数为多少?”对程序员来说是约束不明,应该约束。一是涉及到程序中到底打印多少个月,二是涉及到变量类型的定义问题,如果月数稍大,int是不行的(兔子数急剧增长),要用long,月数太大,估计long也不行,要用float。由于题目没说清,我自行按24个月进行了自我约束。
(2) 打印与计算职责混在一起,我理解是不是说在printf中不能有计算?我记得有编程准则说的是printf中不能有关联性计算。参见 http://kan.weibo.com/con/3518879943468610?_from=text 。不过此意见可以采纳。
(3) 此题目几乎网上所有解答都是用数学中的斐波那契数列来解答的(方法一),我的意思是应该假设不知道斐波那契数列而直接用程序流程来计算每个月的兔子总数(方法二)。
(4) 方法二的RabID[MAXNUM]太浪费,其原因是:由于兔子数可能很大,做了个简单的保守估计,当然可能是数学推理不细致,可能可以更节省些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP