幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: august

[通用编程] C程序题

[复制链接]

0

主题

1

帖子

13

积分

②入门

积分
13
发表于 2007-11-3 23:06:59 | 显示全部楼层
额,看到这个帖子时已经过了半个多月,本人只是个小白,所以解说可能不太专业,请大家不要笑话啊 [s:1]
PS:<>内是我的解释

#include <stdio.h>
#define TRUE 1
#define FALSE 0

typedef int bool;
<定义一个数值类型的布尔值,就相当于做了一个开关>
void main( void ) {
    int m, n, i, j;
    bool done = FALSE;
<把开关命名为done,默认开关在OFF>
   
    for ( m = 6; !done; m += 6 ) { /* --------> 这里m为什么以6开始??? */
<这个楼上的已经解释了,m就是最后一个人M君拿的糖数,既然M君前面那个人:M-1君拿了M-1的糖+剩余糖的7分之一,那么他拿完剩下的糖就必然是6的倍数,否则就会出现M-1君拿到的糖数量带小数点,你可以想象一下一个拿了1/x块糖的人 [s:5] >
        done = TRUE;
<打开开关>
        n = m;                    /* n为最后一个同学所拿到的糖的数量(即人数),done=TRUE假设当前n满足条件 */
<设n也是最后一个人拿的糖数,根据已知条件它也是人数>
        for ( i = m - 1; ( i >= 1 ) && done; i-- ) {
<这句话是说设i的初始值为m-1,对了,就是说for要从刚才我说的那个M-1君开始研究,并且逐个向前研究(i--),直到研究完第一个人或者开关done又处在OFF状态下>
            j = n/6 + i;                /* 第i个同学分到的糖的数量 ------>为什么这里等于第i个的数量呢? */
<这个问题真的很汗
“让第一个同学先拿1块糖,再把盘中的糖分1/7给他;然后让第二个同学拿2块糖,再把盘中的糖的1/7给他;第三个同学拿3块糖后,仍把盘中的糖的1/7给他。照这个办法分下去”
因为m也是人数,所以M君的编号可以设为m,那么他前一个人的编号就可以设为m-1,也就是i
,因为1号同学拿一个,2号同学拿2个,所以i号同学拿i个 [s:5] ,至于那个n/6是因为M-1君拿了m-1块糖加剩下7分之一,所以剩下的7分之6:七分之一=6,而n恰恰就是指那7分之6的数量所以要除以6>
            n = n/6*7 + i;              /* 第i个同学分到糖之前所剩的糖的数量*/
<这个不用解释了吧>
            if ( j != m )
                done = FALSE;          /* 每个人分到的糖块数相同.不满足就退出模拟过程对人数重新取值 */
<这句话真得很诡异 [s:5] j!=m就是说如果不满足M-1君的糖=M君的糖(也就是说不满足"每个人分到的糖块数相同"这一条件)的话,就把开关放在OFF上(也就是终止第2个for循环,说明目前假设的最后一个人(M君)拿的数不能满足"每个人分到的糖块数相同"这一条件,要重新给M君假设他的糖数(这就是M+=6的作用所在))>
        }
<循环,类似于冒泡法,把单独讨论M君与M-1君的函数推广到讨论所有相邻的两个人>
    }
    printf ("%6d%6d\\n", m-6, m-6);
<输出结果,这里还得汗一下,前面第一个for中!done代表当done为ture时就结束大循环,结果呢,大循环是结束了m可不忘又加个6,所以得在这里减回来,害我看了半天啥意思[s:6][s:6]>
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-3 09:07 , Processed in 0.014200 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表