- 注册时间
- 2006-6-19
- 最后登录
- 2010-1-23
⑥精研
- 积分
- 2223
|
发表于 2007-10-7 03:16:39
|
显示全部楼层
我觉得...这题既然是让计算机算的,能不动人脑就不动人脑 (被拖走
好吧,不开玩笑,不过这题有十分多的高效解法.不可能全列出来.复杂的也不列出来,只说最直观的.
其中最短的就是纸笔推出数列通项,求和列一个一元方程.这个就算了.直接把答案输出出来就行 (死
再次,可以依靠"最后一个同学所拿的糖的数量刚好等于人数"+"每个人分到的糖块数相同"+"第n个人要先拿n块糖"来入手.这几个条件综合得知,假如总共有n人,那么最后一个同学(也就是第n个同学)要拿n块糖,同时糖已分完.进一步知道,每个同学拿到的糖数都是n块.所以糖的总数是n的平方.然后再把第一个同学所拿的糖拿来列一个一元二次方程...喂喂这不又直接求出答案了么.
所以,我们换种"蠢"一点的做法来玩玩.在分析得知糖的总数是人数的平方之后,我们就穷举所有大于1的正整数的平方作为糖数,按照最直观的方式去把糖"分配"下去,看看糖分到最后是否能正好分完.如下:
- #include <stdio.h>
- #define TRUE 1
- #define FALSE 0
- #define DIVISOR 7
- typedef int bool;
- bool dist( int ord, int remain ) {
- if ( remain == ord )
- return TRUE; /* 正确分完 */
- if ( remain < ord || remain % DIVISOR != ord )
- return FALSE; /* 不满足分配条件 */
-
- return dist( ord + 1, remain - ord - ( remain - ord ) / DIVISOR );
- }
- void main(void) {
- int person = 2;
- while ( dist( 1, person * person ) == FALSE )
- person++;
- printf( "%d", person );
- }
复制代码 其它的玩法还有很多...例如说可以完全无视上面的分析,硬把大于1的自然数穷举一遍,作为糖数扔进上面那递归函数去分析也可以,收敛速度会慢很多但这数字本来就小,看不出来的. = =
不用平方也不穷举,还可以通过第一个同学拿糖的情况,知道糖总数N肯定符合N = 7k + 1,其中k=1,2,3,4,...用这个条件扔进去检测也可以.
我上面的检测方法是直观的,正向的检查.反过来从最后一个同学开始检查也可以.
用递归也可以,用循环也可以.
总之办法多的是.
P.S. 其实按道理说只有1人,每人拿到1糖的结果也符合规律,只不过题目里已经出现了3,就假设人数大于等于3吧.这样在解一元二次方程的时候也可以扔掉一个解.
Have fun ^ ^ |
|