【C语言小练习】猴子吃桃子的问题
2010-11-28 18:21
225 查看
题目:猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
正向思维
输出:
第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 个桃子。
-------------------------------------------------------
逆向思维
输出:
--------------------
天数: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个桃子,我想,就算是恐龙,估计一天要吃掉这么多桃子都成问题。
换做是人,就算每个桃子,添一下,都得添上大半天。。
希望出题人,以后把数字换换。。不要涂炭生灵啊~~
第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。
到第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语言解决猴子吃桃子问题
- 【C语言】猴子吃桃子问题
- 经典的猴子吃桃问题,C语言算法,根据天数和当日桃子个数,求第一天猴子所摘桃的个数,
- 经典的猴子吃桃问题,C语言算法,根据天数和当日桃子个数,求第一天猴子所摘桃的个数,
- 【C语言】猴子吃桃问题。猴子第一天摘下若干个桃子,每天都吃了前一天剩下的一半零一个,到第10天早上想再吃的时候,就剩下一个桃子. 求第一天共摘多少个桃子。
- 猴子吃桃子问题(C语言)
- C语言:猴子吃桃问题,每天吃一半多一个,第 10天后只剩1个,求共多少个
- c语言50题之小球落地问题、猴子吃桃问题
- C语言 解决迷宫问题练习
- 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一
- C语言:猴子吃桃问题,每天吃一半多一个,第 10天后只剩1个,求共多少个
- C语言 猴子吃桃问题
- python基础练习---猴子吃桃问题
- 自由落体问题也可以用编程来搞定哦!猜猜猴子摘了多少桃子?
- 【C语言】猴子选大王问题
- 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个
- 猴子吃桃子问题
- 【C语言】猴子吃桃问题
- [置顶] 猴子吃桃子问题:猴子第一天摘了若干个桃子,当时吃了若干个,还不瘾,又多吃了一个,第二天早上,又将剩下的桃子吃掉了一半,又多吃了一个。以后每一天早上都吃前一天剩下的一半零一个,直到第十天发现剩一个了,求
- C语言——著名的Josephus问题练习