约瑟夫环形算法 用c语言实现
2014-03-22 18:06
399 查看
算法的大致要求是:30个人组成一个环,从第一个人开始查数,查到第九个就拉去去枪毙一分钟,然后从下一个开始查数,每查到9就拉出去枪毙一分钟,直到枪毙完第15个人。
c语言实现如下:
#include "stdio.h"
void main(){
int array_list[30];
int i;
int calNum=0;
int total=0;
int index=-1;
for(i=0;i<30;i++){
array_list[i]=1;
}
while(1){
index++;
index%=30;
if(array_list[index]==1){
calNum++;
}
if(calNum==9){
array_list[index]=0;
total++;
calNum=0;
printf("%3d",(index+1));
}
if(total==15){
break;
}
}
}
这个是用数组实现的,下面是用链表实现的:
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList p,q,m,s,L;
int i,j,k,count=0;
void initLinkList(LinkList L){
//初始化为单链循环
L=(LinkList)malloc(sizeof(LNode));
L->data=1;
L->next=L;
//使用尾插法创建循环单链表
p=L;
for(i=1;i<=29;i++){
s=(LinkList)malloc(sizeof(LNode));
s->data=i+1;
s->next=p->next;
p->next=s;
p=s;
}
q=p->next;
j=0;
while(1){
while(j<8){
q=q->next;
j++;
}
if(j==8){
m=q->next;
q->next=m->next;
k=m->data;
printf("%d\n",k-1);
free(m);
j=0;
count++;
}
if(count==15){break;}
}
}
void main(){
initLinkList(&L);
}
修改完成。如有不妥,请您指教。
c语言实现如下:
#include "stdio.h"
void main(){
int array_list[30];
int i;
int calNum=0;
int total=0;
int index=-1;
for(i=0;i<30;i++){
array_list[i]=1;
}
while(1){
index++;
index%=30;
if(array_list[index]==1){
calNum++;
}
if(calNum==9){
array_list[index]=0;
total++;
calNum=0;
printf("%3d",(index+1));
}
if(total==15){
break;
}
}
}
这个是用数组实现的,下面是用链表实现的:
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList p,q,m,s,L;
int i,j,k,count=0;
void initLinkList(LinkList L){
//初始化为单链循环
L=(LinkList)malloc(sizeof(LNode));
L->data=1;
L->next=L;
//使用尾插法创建循环单链表
p=L;
for(i=1;i<=29;i++){
s=(LinkList)malloc(sizeof(LNode));
s->data=i+1;
s->next=p->next;
p->next=s;
p=s;
}
q=p->next;
j=0;
while(1){
while(j<8){
q=q->next;
j++;
}
if(j==8){
m=q->next;
q->next=m->next;
k=m->data;
printf("%d\n",k-1);
free(m);
j=0;
count++;
}
if(count==15){break;}
}
}
void main(){
initLinkList(&L);
}
修改完成。如有不妥,请您指教。
相关文章推荐
- 约瑟夫算法的C语言实现
- <2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现
- 转置矩阵的分块并行乘法(C语言实现),计算矩阵C[rawn][rawn]=A[rawm][rawn]'*B[rawm][rawn],子块大小为S*T,其算法实现原理参加本代码的附件。
- C语言实现数组快速排序(含对算法的详细解释)
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- 数值计算方法与算法:C语言实现利用Gauss消元法解方程组
- C语言实现:约瑟夫问题(数组和单链表2种方法)
- 经典算法研究:模式匹配(子串匹配)之 KMP 算法(C语言实现版)
- 经典算法研究:模式匹配(子串匹配)之 BM 算法(C语言实现版)初版
- 第7周实践项目1.1 环形队列中用队尾和队的元素个数来实现队列的算法库
- C语言实现线性表连续存储结构相关算法
- C语言中实现 点在多边形内 算法
- 结点遍历C语言实现二叉树的常用的算法(递归与非递归实现遍历)
- C语言实现的排列组合问题的通用算法、解决方法
- FFT的C语言算法实现
- Sunday 算法的 O-C语言实现
- 算法与数据结构【三】——栈的C语言实现
- C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置
- 环形队列——C语言实现、python实现
- C语言求最大公约数(两种最简单的算法实现)