论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

【用计算机求解经典问题】难忘的五猴分桃

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:43:53

/*问题描述*/

/*

*五只猴子一起摘了一堆桃子,因为太累,决定先睡一觉再分。
*过了不知多久,来了一只猴子,它见别的猴子没来,便将一堆桃子平均分成 5 份,结果*多了一个,就将多的这个吃了,拿走其中的一堆。
*又过了不知多久,第二只猴子来了,它不知道有一个同伴已经来过,还以为自己是第一*个,便将地上的桃子平均分成 5 份,发现也多了一个,同样吃了这一个,拿走其中的一*堆。第3只,第4只,第5 只猴子都是这样......
*问这5只猴子至少摘了多少个桃子?

*/

/*

程序说明:

(1)修改宏 MAXNUM 的大小,重新编译后即可搜索出所有0~MAXNUM 之间满足条件的数字。

(2)这是一种比较直接的算法,有许多地方值得改进。欢迎大家一起探讨

(3)本程序用vc++6.0在win2000环境中编译通过。

*/

/*zhaitao.c*/

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"

#define  bool int
#define  true 1
#define  false 0

#define MAXNUM 5000

/*target number struct*/
typedef struct tagTARGETNUM
{
 int totalN;
 int remains;
} _TargetNum, *p_TargetNum;

typedef struct tagTAGTEST
{
 _TargetNum targetNum[MAXNUM];
 int count; /*num  satisfied our condition*/
}_tagTest, p_tagTest;

bool monkey(int iOriginal, int * pRemains);
bool SepPeach(int iTotal, int *remains);
void FindSmallest(_tagTest* tgtst);

void main(void)
{
 int i = 0;
 int tempRmn = 0;
 bool ret = false;
 _tagTest tgtst;
 memset(&tgtst,0,sizeof(_tagTest));
 
 printf("test-- from:%d , to:%d\npress any key to continue\n",i,MAXNUM);
 getchar();
 printf("starting find...\n");

 for(; i < MAXNUM; i++)
 {
  if( (ret = SepPeach(i,&tempRmn)) != true)
  {
   continue;
  }
  else
  {
   tgtst.targetNum[tgtst.count].totalN = i;
   tgtst.targetNum[tgtst.count++].remains = tempRmn;
  }
 }

 FindSmallest(&tgtst);
 getchar();
}

/************************************************************************/
/* if the original number satified our condition,
the function will return true, else return false.                      */
/************************************************************************/
bool monkey(int iOriginal, int * pRemains)
{
// int remains = 0;
 
 iOriginal -= 1; //remain 1
 if (iOriginal % 5 != 0)
 {
  return false;
 }
 *pRemains = iOriginal - iOriginal/5;
 
 return true;
}

bool SepPeach(int iTotal, int* remains)
{
 int flag = false;
 int tempNum = 0; //temporary number of remained peaches
 int i = 0;
 tempNum = iTotal;
 for(i = 0; i < 5; i++)
 {
  if((flag = monkey(tempNum, &tempNum)) == false)
  {
   printf("total num of peaches %d does not satisfy our condition!\n",iTotal);
   return false;
  }
 }
 
 *remains = tempNum;
 printf("total num of peaches: %d, remains: %d \n", iTotal, *remains);

 return true;
}

void FindSmallest(_tagTest* tgtst)
{
 int i;
 //int temp = -1;
 _TargetNum tempTn;
 tempTn.totalN = 1000000;
 printf("we found %d nums which satisfied our condition \n",tgtst->count);
 if (tgtst->count == 0) {
  return;
 }
 else
 {
  printf("----these nums are:\n");
 }
 for(i = 0; i < tgtst->count; i++)
 {
  printf("total:%d   remains:%d\n",tgtst->targetNum[i].totalN,tgtst->targetNum[i].remains);
  if(tempTn.totalN >= tgtst->targetNum[i].totalN)
  {
   tempTn.totalN = tgtst->targetNum[i].totalN;
   tempTn.remains = tgtst->targetNum[i].remains;
   
  }

 }
 printf("\n----------------------------------------\n");
 printf("the smallest total num of peaches is: %d, the remains is: %d\n",tempTn.totalN,tempTn.remains);
 return;
}

上一篇:{实例}我的"欢乐颂"面世了 人气:6080
下一篇:{实例}教学计划编制问题 人气:5810
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058