标题:[求助]怎样用C语言编程-----地主杀奴隶???(输出唯一存活的奴隶编号)请 ...
只看楼主
william_zyf
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-7-4
得分:0 

想过了,可是写出来不对啊.请大家帮帮忙吧.谢谢!!!


人生自古谁无情,情到深处天地动!
2007-07-05 11:51
SpaceC
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2007-6-20
得分:0 

[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编辑过]


2007-07-05 16:38
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
得分:0 
在space的一再鼓励下,终于写下了数组版的注解,不一定正确,请指教。谢谢。

/* 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编辑过]

2007-07-05 18:09
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
得分:0 
就是循环链表
数据结构的

   好好活着,因为我们会死很久!!!
2007-07-05 19:11
william_zyf
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-7-4
得分:0 
55555555~偶好感动,谢谢大家的帮助!小弟受益匪浅啊!!!谢谢大家!!!

人生自古谁无情,情到深处天地动!
2007-07-05 21:25
宋名
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-6-25
得分:0 
用函数循环法
2007-07-05 23:00
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
得分:0 
半数组半变量法
#include<stdio.h>
main()
{
int i,j=1,k=703,a[37]={0},temp;
while(k>0)
for(i=1;i<38;i++)
if(a[i-1]==0&&j%5==0)
{ temp=i;
k=k-i;
a[i-1]=1;
j=1;
}
else if(a[i-1]==0)
j++;
printf("%d",temp);
}

[此贴子已经被作者于2007-7-6 16:02:19编辑过]


羊肉串 葡萄干 哈密瓜!!
2007-07-05 23:38
SpaceC
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2007-6-20
得分:0 

请教LS的,k=703 这个值是什么意思,怎么得到的?


2007-07-06 09:14
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
得分:0 
回复:(SpaceC)请教LS的,k=703 这个值是什么意思,...
703=1+2+3+4+。。。+37
我是口算的
或者是在前面加一句
for(i=1;i<38;i++)
k=k+i;

羊肉串 葡萄干 哈密瓜!!
2007-07-06 13:57
SpaceC
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2007-6-20
得分:0 

如果奴隶的数量是5个,你用你的方法试试,结果好像不对吧?

怀疑你的算法的正确性


2007-07-06 14:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-152509-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.698032 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved