首页 > 代码库 > 黑马程序员--c语言练习:亚瑟夫环
黑马程序员--c语言练习:亚瑟夫环
发一下之前用c语言做的亚瑟夫环,希望多多指教,共同学习
用标记的方式:
#include <stdio.h>
int count = 1; //用于循环:判定当前的人所报的数是否为3的倍数
int main()
{
int i, j = 15; //i 用于数据循环 //j 记录人数
int a[15];
for(i = 0; i <j ; i++) // 为每个人赋值 1 目的是判定出去的人 a[i] = 0
a[i] = 1;
// 循环方式为i 0~15 环形循环,结束条件j==1,即只剩一人
for(i = 0; j > 1 ;i ++)
{
if(i>14) // i大于数据界限,从零重新开始
i -= 15;
if(a[i]) // a[i]!=0 ,则a[i]继续参与判定
{
if(count % 3 == 0) // 若报数为3的倍数
{
a[i] =0; //使他下一轮不参与判定
j--; //判定人数-1
}
count++; //报数+1
}
}
//只有叛徒的a[i]值任然为1,若在数组中的位置i,则他的真实位置是i+1
for(i = 0; i < 15; i++)
if(a[i])
printf("叛徒是%d\n",i+1);
return 0;
}
用链表链接形成环
#include <stdio.h>
#include<malloc.h>
#define LEN sizeof(struct Defect) // 计算结构体大小
struct Defect // 定义叛徒结构体
{
int number; // 为每个人自己的号码牌
struct Defect *next; // 指针,下面用它链接形成环体
};
void def(int n,int m) // 传入人数n和报数为m时退出
{
int i = 2,count = 2; // i 记录人数,count记录报数
struct Defect *head,*p,*q; // 设置三个结构体指针
q = head= (struct Defect *)malloc(LEN); // 为第一个人申请结构体
head->number = 1; // 定义第一个结构体的号码为1
while(i<=n) // 用循环申请n个人的结构体,并为每个人的号码赋值
{
p = (struct Defect *)malloc(LEN); // 申请
p->number = i++; //赋值
q->next = p; //链接
q = p; //定位
}
i = n; //记录当前人数
p->next = head; //最后的人和第一个人链接
q = head; //指定开始位置,由于设定为一个换 需要的话可以设定任意位置为开始位置
while(i>1) //人数大于1执行循环
{ p = q->next; //p指向下一个人
if(count%m == 0) //如果报数为m的倍数
{
q->next = p->next; //删除当前的结构体
p->next = 0;
i--; //人数减一
}
else
q = p; //不满足条件,移动判定人
count++; //报数加1
if(count>3) //报数大于三时,换为1 其实可以没有这个判定,为了题目设计的123,123,123~~
count = 1;
}
printf("%d\n",q->number); //输出剩下的那个人
}
int main()
{
int n,m; //设置人数,和报数退出条件
printf("请输入总人数:\n");
scanf("%d",&n);
if(n<2)
{
printf("游戏无意义!!");
return 0;
}
printf("请输入退出者的报数:\n 提示:若为1,则失去游戏的意义\n");
scanf("%d",&m);
if(n<2)
{
printf("游戏无意义!!");
return 0;
}
def(n,m);
return 0;
}
黑马程序员--c语言练习:亚瑟夫环