想过了,可是写出来不对啊.请大家帮帮忙吧.谢谢!!!
人生自古谁无情,情到深处天地动!
[CODE]/* SlaveUseArray.c -- 找出唯一存活的奴隶(数组版)
* Author: Space
* Date: 2007/07/05
* Version: 1.0
*/
#include<stdio.h>
#define LIVE 1
#define DEAD 0
#define SLAVE_NUM 37
#define COUNT 5
int main(void)
{
int slave[SLAVE_NUM];
int cnt = 1;
int i = 0;
int prev = 0;
for (i = 0; i < SLAVE_NUM; ++i)
slave[i] = LIVE;
i = 0;
do
{
prev = i;
if (cnt % COUNT == 0)
{
slave[i] = DEAD;
cnt = 0;
}
if (i == SLAVE_NUM - 1)
i = 0;
else
++i;
while (slave[i] != LIVE)
{
if (i == SLAVE_NUM - 1)
i = 0;
else
++i;
}
++cnt;
/* for debugging
for (int j = 0; j < SLAVE_NUM; ++j)
printf("%d\t", slave[j]);
putchar('\n');
*/
}while(prev != i);
printf("第%d个奴隶最后存活了下来!\n", i + 1);
return 0;
}[/CODE]
这是数组版的,没有加注释
其实原理跟链表版的一样
在链表版,如果奴隶被杀了就删除相应节点;而数组版就用相应位置的值(LIVE/DEAD)来标识奴隶是否被杀了
[此贴子已经被作者于2007-7-5 16:39:31编辑过]
/* SlaveUseArray.c -- 找出唯一存活的奴隶(数组版)
* Author: Space Comments: laigaoat2005
* Date: 2007/07/05 Comments Date: 2007/07/05
* Version: 1.0
*/
#include<stdio.h> //头文件
#define LIVE 1 //1,存活
#define DEAD 0 //0,死去
#define SLAVE_NUM 37 //奴隶编号 (数组大小)
#define COUNT 5 //被杀奴隶记数编号
int main(void) //返回整型主函数 无参数
{
int slave[SLAVE_NUM]; //定义奴隶编号数组
int cnt = 1; //临时记数:用于满5清0,满5时就找到要杀的奴隶
int i = 0; //循环控制数
int prev = 0; //上一次i的值,如果i经过一个周期还是没有变的话,说明只剩下最后一个奴隶!
//写到这里,注解终于完成了。但是肯定还不完全正确,请高手指教。
for (i = 0; i < SLAVE_NUM; ++i) //i从0到36循环,
slave[i] = LIVE; //给还生存的奴隶编号 初始为0到36共37人 ,每人都是1,现在都是生存着的
i = 0; // 将i赋于值0
do //只要prev不等于i就循环执行以下语句,直到prev为0才退出
//(当prev等于i时就找到了存活奴隶编号:slave[i],也就是第i+1个奴隶!
//第五次写到这里,终于看懂了space的算法!汗!谢谢space!)
{
prev = i; //将i的值赋线prev,第一次时,都等于0,后来为: 1,2,3,4,
if (cnt % COUNT == 0) //用 临时记数 除 被杀奴隶记数 取模(余数),如果余数为0,该奴隶被杀(将该奴隶编号赋值0),
//同时将临时记数设为0
{
slave[i] = DEAD;
cnt = 0;
}
if (i == SLAVE_NUM - 1) //当执行到数组第37个元素(slave[36])时,
i = 0; //将i清0,又从第一个奴隶开始计数
else //当没有执行到第37个元素时
++i; //i自增1,继续
//if语句的作用:确保程序的执行从0到36,又从0到36……
while (slave[i] != LIVE) //只要当前元素不等于1(表明该奴隶是被杀死的,值为0),就执行下面的语句 ,存活的奴隶不在循环计算之列)
//建议换成 while (slave[i] == dead) (个人感觉!=让大脑多一次计算)
{
if (i == SLAVE_NUM - 1) //如果i等于36(执行到数组第37个元素(slave[36])时),此时第37个奴隶是killed的
i = 0; // 将i清0,又从第一个奴隶开始计数
else
++i; //否则,i自增1,继续
} //内层while循环的作用:当指针处奴隶是killed的就移动到下一个奴隶的指针,如果当前killed的奴隶是第37个,又返回第一个开始计数
++cnt; //临时记数自增1
}while(prev != i);
printf("第%d个奴隶最后存活了下来!\n", i + 1); //打印存活下来的奴隶编号
return 0;
}
[此贴子已经被作者于2007-7-5 19:45:16编辑过]