【约瑟夫问题】约瑟夫相关问题(C语言)2)反Josephu环问题...
答案:2 悬赏:70 手机版
解决时间 2021-02-06 17:55
- 提问者网友:捧腹剧
- 2021-02-06 05:07
【约瑟夫问题】约瑟夫相关问题(C语言)2)反Josephu环问题...
最佳答案
- 五星知识达人网友:夜风逐马
- 2021-02-06 06:21
【答案】 反Josephu环问题
#include
#include
typedef struct
{
struct T_LIST* pre;
struct T_LIST* next;
} T_LIST;
T_LIST* GetPreOne(T_LIST* ThisOne, int m)
{
for (; m > 1; m--)
{
ThisOne = ThisOne->pre;
}
return ThisOne;
}
int main()
{
T_LIST* head, //当前
* pLast,//最后一个人
* tem, *tem2; //临时交换指针
int n,//总人数
m,//循环长度
x,//最后人
k,
i;//当前人数
printf(输入相关数据(n,m,x):\n);
scanf(%d,%d,%d, &n, &m, &x);
pLast = malloc(sizeof(T_LIST));
head = malloc(sizeof(T_LIST));
head->pre = head->next = pLast;
pLast->pre = pLast->next = head;
printf(n=%d,m=%d,x=%d\n,n,m,x);
i = 2;
for (; i pre;//临时指针指向前一个节点
head->pre = tem2 = malloc(sizeof(T_LIST)); //建立前一局被淘汰者,并构建本局数1的人pre
tem->next = head->pre;//临时节点修复
tem2->next = head;//上局淘汰者next修复
tem2->pre = tem;//上局淘汰者pre修复
head = head->pre;//指向被淘汰者,准备下轮循环
}
//脱离循环后head指向第一个被淘汰者
//调用GetPreOne,是head指向数1的人
head = GetPreOne(head, m);
while (1)
{
if (pLast == head)
{
break;
}
pLast = pLast->next;
x++;
}
k = x % n ;
if(k==0)
k=41;
printf(k = %d\n, k);
//收尾,释放内存
while(pLast->next != head)
{
pLast = pLast->next;
free(pLast->pre);
}
free(pLast);
free(head);
return 0;
}
=============================================
Josephu环问题的变形(p1012)
#include
#include
int fun(char* data, int k, int m);
int main()
{
int k, m;
char* data;
printf(Please input k:\n);
scanf(%d, &k);
data = malloc(2 * k);
for (m = k + 1;; m++)
{
if (fun(data, k, m))
break;
}
printf(m=%d\n, m);
free(data);
return 0;
}
int fun(char* data, int k, int m)
{
int i = 0, //数数时的位置
j = 0, //已经杀死的人数
t = 0; //数数时的累加器
for (; i
#include
#include
typedef struct
{
struct T_LIST* pre;
struct T_LIST* next;
} T_LIST;
T_LIST* GetPreOne(T_LIST* ThisOne, int m)
{
for (; m > 1; m--)
{
ThisOne = ThisOne->pre;
}
return ThisOne;
}
int main()
{
T_LIST* head, //当前
* pLast,//最后一个人
* tem, *tem2; //临时交换指针
int n,//总人数
m,//循环长度
x,//最后人
k,
i;//当前人数
printf(输入相关数据(n,m,x):\n);
scanf(%d,%d,%d, &n, &m, &x);
pLast = malloc(sizeof(T_LIST));
head = malloc(sizeof(T_LIST));
head->pre = head->next = pLast;
pLast->pre = pLast->next = head;
printf(n=%d,m=%d,x=%d\n,n,m,x);
i = 2;
for (; i pre;//临时指针指向前一个节点
head->pre = tem2 = malloc(sizeof(T_LIST)); //建立前一局被淘汰者,并构建本局数1的人pre
tem->next = head->pre;//临时节点修复
tem2->next = head;//上局淘汰者next修复
tem2->pre = tem;//上局淘汰者pre修复
head = head->pre;//指向被淘汰者,准备下轮循环
}
//脱离循环后head指向第一个被淘汰者
//调用GetPreOne,是head指向数1的人
head = GetPreOne(head, m);
while (1)
{
if (pLast == head)
{
break;
}
pLast = pLast->next;
x++;
}
k = x % n ;
if(k==0)
k=41;
printf(k = %d\n, k);
//收尾,释放内存
while(pLast->next != head)
{
pLast = pLast->next;
free(pLast->pre);
}
free(pLast);
free(head);
return 0;
}
=============================================
Josephu环问题的变形(p1012)
#include
#include
int fun(char* data, int k, int m);
int main()
{
int k, m;
char* data;
printf(Please input k:\n);
scanf(%d, &k);
data = malloc(2 * k);
for (m = k + 1;; m++)
{
if (fun(data, k, m))
break;
}
printf(m=%d\n, m);
free(data);
return 0;
}
int fun(char* data, int k, int m)
{
int i = 0, //数数时的位置
j = 0, //已经杀死的人数
t = 0; //数数时的累加器
for (; i
全部回答
- 1楼网友:山有枢
- 2021-02-06 06:41
哦,回答的不错
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯