您的位置:首页 > 编程语言 > C语言/C++

【C语言小练习】猴子吃桃子的问题

2010-11-28 18:21 225 查看
题目:猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。

第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。

到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。

 

正向思维

#include <stdio.h>
#include <conio.h>

//返回-1,为错误-> Number == 1
//返回0,为终止-> 不能整除2
//返回1,继续
int GetHalf( unsigned int *numberIn )
{
if( (*numberIn) == 0 )
{
printf( "/r/n[GetHalf]错误:当前参数为0。/r/n" );
return -1;
}
else if( ((*numberIn) % 2) != 0 )
{
printf( "/r/n[GetHalf]错误:当前参数为%u,不能被2整除。/r/n", (*numberIn));
return 0;
}
else
{
(*numberIn) = (*numberIn) / 2;
printf( "吃掉一半,还剩%u 。", (*numberIn));
return 1;
}
}

//返回-1:出错
//返回0:终止
//返回1:继续
int Eat( unsigned int *numberIn )
{
int getHalfState = 0;
getHalfState = GetHalf( numberIn );
if( getHalfState != 1 )
{
return getHalfState;
}
else
{
(*numberIn)--;
printf( "吃掉一个,还剩%u 。", (*numberIn));
}
}

int Game( unsigned int *numberIn )
{
//1.验证参数
if( (*numberIn) == 0 )
{
printf( "错误!参数不能为0" );
return -1;
}
//2.开始游戏
unsigned int counter = 0;
int eatState = 0;
while ( true )
{
//2.1 汇报当前值
counter++;
printf( "第%u天: 现在有 %u 个桃子。", counter, (*numberIn) );
//2.2 终止判断
if( ((*numberIn) == 1) && (counter == 10) )
{
printf( "符合要求。/r/n" );
return 0;
}
//2.3 尝试Eat
eatState = Eat( numberIn );
if( eatState == 0 )
{
if( counter == 10 )
{
return 0;
}
else
{
return -1;
}
}
else if( eatState == -1 )
{
return -1;
}
else
{
printf( "/r/n");
}
}
}

int main( void )
{
//1.定义变量,并且初始化
unsigned int number = 0;
unsigned int endNumber = 2000;
int gameState = 0;
//2.开始游戏
unsigned int t = 0;
for( number = 1; number <= endNumber; number++ )
{
t = number;
printf( "---------------------/r/n");
printf( "当前桃子数:%u 。游戏开始。/r/n", t );
gameState = Game( &t );
if( gameState == 0 )
{
printf( "得出一个结果。当前number = %u 。按任意键继续。/r/n", number );
getch();
}
else
{
//getch();
}
}
//END.结束
printf( "/r/n程序运行结束。请按任意键退出。/r/n");
getch();
return 0;
}


 

输出:

第1天: 现在有 1534 个桃子。吃掉一半,还剩767 。吃掉一个,还剩766 。
第2天: 现在有 766 个桃子。吃掉一半,还剩383 。吃掉一个,还剩382 。
第3天: 现在有 382 个桃子。吃掉一半,还剩191 。吃掉一个,还剩190 。
第4天: 现在有 190 个桃子。吃掉一半,还剩95 。吃掉一个,还剩94 。
第5天: 现在有 94 个桃子。吃掉一半,还剩47 。吃掉一个,还剩46 。
第6天: 现在有 46 个桃子。吃掉一半,还剩23 。吃掉一个,还剩22 。
第7天: 现在有 22 个桃子。吃掉一半,还剩11 。吃掉一个,还剩10 。
第8天: 现在有 10 个桃子。吃掉一半,还剩5 。吃掉一个,还剩4 。
第9天: 现在有 4 个桃子。吃掉一半,还剩2 。吃掉一个,还剩1 。
第10天: 现在有 1 个桃子。
 

 

 

 

 

-------------------------------------------------------

逆向思维

#include <stdio.h>
#include <conio.h>

void Game( unsigned int dayNumberIn )
{
//1.验证参数
if( dayNumberIn == 0 )
{
printf( "错误!参数不能为0" );
return;
}
//2.开始游戏
unsigned int i = 0;
unsigned int sum = 1;
for( i = 1; i <= dayNumberIn ; i++ )
{
if( i == 1 )
{
printf( "倒数第%u天,桃子:%u 个。/r/n", i, sum );
}
else
{
sum++;
printf( "倒数第%u天。吐出来1个,现在桃子有%u个。", i, sum );
sum += sum;
printf( "再吐出一倍的桃子,现在共有%u个。/r/n", sum );
}

}
}

int main( void )
{
//1.定义变量,并且初始化
unsigned int i = 0;
//2.开始游戏
for( i = 1; i <= 10; i++ )
{
printf( "--------------------/r/n" );
printf( "天数:%u 。新游戏开始。/r/n", i);
Game( i );
printf( "按任意键继续。/r/n" );
getch();
}
//END.结束
printf( "/r/n程序运行结束。请按任意键退出。/r/n");
getch();
return 0;
}


 

 

 

输出:

--------------------
天数:10 。新游戏开始。
倒数第1天,桃子:1 个。
倒数第2天。吐出来1个,现在桃子有2个。再吐出一倍的桃子,现在共有4个。
倒数第3天。吐出来1个,现在桃子有5个。再吐出一倍的桃子,现在共有10个。
倒数第4天。吐出来1个,现在桃子有11个。再吐出一倍的桃子,现在共有22个。
倒数第5天。吐出来1个,现在桃子有23个。再吐出一倍的桃子,现在共有46个。
倒数第6天。吐出来1个,现在桃子有47个。再吐出一倍的桃子,现在共有94个。
倒数第7天。吐出来1个,现在桃子有95个。再吐出一倍的桃子,现在共有190个。
倒数第8天。吐出来1个,现在桃子有191个。再吐出一倍的桃子,现在共有382个。
倒数第9天。吐出来1个,现在桃子有383个。再吐出一倍的桃子,现在共有766个。
倒数第10天。吐出来1个,现在桃子有767个。再吐出一倍的桃子,现在共有1534个。
按任意键继续。

 

额。。输出有点恶心。。

 

 

----------------------

后记。。话说,这题真郁闷,第一天,猴子要吃掉767个桃子,我想,就算是恐龙,估计一天要吃掉这么多桃子都成问题。

换做是人,就算每个桃子,添一下,都得添上大半天。。

 

希望出题人,以后把数字换换。。不要涂炭生灵啊~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  语言 c 游戏
相关文章推荐