1.约瑟夫环-递归
#include<stdio.h>
#include<stdlib.h>
#define FAIL 0
#define SUCCESS 1
//读入初值
int getvalue(int* sum,int* count,int* alive)
{
printf("Please input total num:");
while(1)
{
scanf("%d",sum);
if(*sum>0)
break;
printf("The input is not valid.\n");
};
printf("Please input out num:");
while(1)
{
scanf("%d",count);
if(*count>=1)
break;
printf("The input is not valid.\n");
};
printf("Please input survival number:");
while(1)
{
scanf("%d",alive);
if(*alive>=0&&*alive<=*sum)
break;
printf("The input is not valid.\n");
};
return SUCCESS;
}
//递归
int ysfdg(int sum,int value,int n)
{
if(n==1)
return (sum+value-1)%sum;
else
return (ysfdg(sum-1,value,n-1)+value)%sum;
}
//主函数
int main()
{
int sum=0,count=0,alive=0,i=0;
getvalue(&sum,&count,&alive);
printf("leave sequence:\n");
for(i=1;i<=sum-alive;i++)
printf("%2d ",i,ysfdg(sum,count,i)+1);
return 0;
}
2.约瑟夫环-链表
#include<stdio.h>
#include<stdlib.h>
#define FAIL 0
#define SUCCESS 1
typedef struct gamenode
{
int number;
struct gamenode* next;
} node;
//读入初值
int getvalue(int* sum,int* count,int* alive)
{
printf("Please input total num:");
while(1)
{
scanf("%d",sum);
if(*sum>0)
break;
printf("The input is not valid.\n");
};
printf("Please input out num:");
while(1)
{
scanf("%d",count);
if(*count>=1)
break;
printf("The input is not valid.\n");
};
printf("Please input survival number:");
while(1)
{
scanf("%d",alive);
if(*alive>=0&&*alive<=*sum)
break;
printf("The input is not valid.\n");
};
return SUCCESS;
}
int ysflb(int n,int k,int s)
{
node *h=NULL,*p=NULL,*q=NULL;
int i=0;
if ((h=(node*)malloc(sizeof(node)*n))==NULL)
{
printf("FAIL!\n");
return FAIL;
}
h->number=1;
h->next=h;
q=h;
printf("leave sequence:\n");
for(i=1;i<n;i++)
{
if ((p=(node*)malloc(sizeof(node)*n))==NULL)
{
printf("FAIL!\n");
exit (-1);
}
else
{
p->next=NULL;
p->number=i+1;
q->next=p;
q=q->next;
}
}
q->next=h; p=h; i=1; k=n-k;
while(k>0)
{
if(i==s)
{
if(p!=p->next)
{
q->next=p->next;
printf("%d ",p->number);
free(p);
p=q->next;
}
else
{
printf("%d ",p->number);
p=q=h=NULL;
}
--k;
}
else
{
p=p->next;
q=q->next;
}
++i;
if(i>=s+1)
i=1;
}
printf("\n");
if(p!=NULL)
{
printf("left num:\n");
h=p;
p=p->next;
while(p!=h)
{
q=p->next;
printf("%d ",p->number);
free(p);
p=q;
}
printf("%d ",h->number);
free(h);
}
return SUCCESS;
}
int main()
{
int sum=0,count=0,alive=0,i=0;
getvalue(&sum,&count,&alive);
ysflb(sum,alive,count);
return 0;
}
3.约瑟夫环-数组
#include <stdio.h>
#include <malloc.h>
void left_num(int* a,int n,int m) {
int out = 0,count = 0,i = 0; //out为出去的人数,count为报数,i为目前报到第几个人
int *p = a;
int num = 0;
for(num = 0;num < n;num++) {
*(a+num) = num+1;
} //为n个人编号1-n
while (out <(n/2)) {
if (*(p+i) != 0) {
count ++; //不等于0才报数+!
}
if (count == m) {
count = 0;
*(p+i) = 0;
out++; //报道m那么,出列人数out+1,且内容置0,报数置0
printf("%d ",i+1);
}
i++;
if (i == n) {
i = 0; //到队尾重头开始
}
}
printf("\n");
//输出剩下的人
printf("left num:\n");
for (num = 0; num < n; num++) {
if (*(a+num) != 0) {
printf("%d ",*(a+num));
}
}
}
int main()
{
int m,n;
int a[50] = {0};
printf("Please input total num:");
scanf("%d",&n);
printf("Please input out num:");
scanf("%d",&m);
printf("leave sequence:\n");
left_num(a,n,m);
return 0;
}
4.约瑟夫环-循环
#include<stdio.h>
int main()
{
int n,m,a;
printf("Please input total num:");
scanf("%d",&n);
printf("Please input out num:");
scanf("%d",&m);
int fanren[n]={0};
int i,j,k=-1;
printf("Please input survival number:");
scanf("%d",&a);
printf("leave sequence:\n");
for(i=0;i<a;i++)
{
for(j=0;j<m;j++)
{
k++;
if(k==n)
k=0;
if(fanren[k]==1)
j--;
}
fanren[k]=1;
printf("%d ",k+1);
}
printf("\n");
printf("left num:\n");
for(i=0;i<n;i++)
{
if(fanren[i]==0)
printf("%d ",i+1);
}
return 0;
}