当前位置: 代码迷 >> C语言 >> [求助]怎么用C语言表达约瑟夫环?
  详细解决方案

[求助]怎么用C语言表达约瑟夫环?

热度:309   发布时间:2006-02-07 19:17:00.0
[求助]怎么用C语言表达约瑟夫环?

大家好,我是刚学C语言,有个题目是关于约瑟夫环的:
比如10个人报数,1,2,3,1,2,3,。。。报数,报到3的出局,如此循环,最后留下谁?
我自己想了很久,程序始终写不出完整的出来,请大家帮忙想想 谢谢了!!!

下面是我自己想的程序,我可以把报3的输出来,没办法把留下的输出来,我的程序如下:
#include<stdio.h>
main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i,,j=2; /*i是变量;j是代表下标;*/
for(i=0;i<10;i++)/*这里我想应该是用while循环,可我写不出来*/
{

for(j=2;j<9;j+=3)
{
printf("%d\t",a[j]);/*这是报3的数*/

}

}

}
请大家多指教!!!!!!!!谢谢!!!

搜索更多相关的解决方案: 约瑟夫  C语言  表达  

----------------解决方案--------------------------------------------------------
我晕 难道没有人可以用数组表达出来吗?
----------------解决方案--------------------------------------------------------

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
//定义Joseph的节点结构体
typedef struct josephnode
{
int joseph_num;
int joseph_password;
}joseph_node;

//输入各个结点信息的函数
void joseph_input(joseph_node arry[],int n,int *begin_num);
//处理函数
void joseph_process(joseph_node arry[],int n,int *begin_num);

void main()
{
int total_pers;
int begin_num=0;
joseph_node * ip_jose;
puts("please enter the total persons:");
scanf("%d",&total_pers);
ip_jose=(joseph_node *)malloc((total_pers*sizeof(joseph_node)));
if(!ip_jose)
exit(1);
joseph_input(ip_jose,total_pers,&begin_num);
joseph_process(ip_jose,total_pers,&begin_num);
}


void joseph_input(joseph_node arry[],int n,int *begin_num)
{
int i;
int password;
printf("please enter the begin password:\n");
scanf("%d",begin_num);
for(i=0;i<n;i++)
{
printf("please enter th%d person's information:\n",i+1);
printf("please enter the person's password:\n");
scanf("%d",&password);
fflush(stdin);
arry[i].joseph_num=i+1;
arry[i].joseph_password=password;
}
}


void joseph_process(joseph_node arry[],int n,int *begin_num)
{
int ip;
int counter=0;
int total_num;
int j;
int count;
int ip_node;
int password;
total_num=n;
ip=0;
password=*begin_num;
//就一个结点的情形
if(total_num==1)
{
printf("th%d person out of the line is :\t",++counter);
printf("%d\n",arry[0].joseph_num);
exit(1);
}

//多个接点的情形
do{
count=0;
do{
count++;
ip_node=ip%total_num;
ip++;
}while(count<password);
//输出出列的那个
printf("th%d person out of the line is :\t",++counter);
printf("%d\n",arry[ip_node].joseph_num);
//删除那个接点重新组合数组
password=arry[ip_node].joseph_password;
ip=(ip-1)%total_num;
total_num=total_num-1;
for(j=ip;j<total_num;j++)
{
//arry[j].joseph_num=arry[j+1].joseph_num;
//arry[j].joseph_password=arry[j+1].joseph_password;
arry[j]=arry[j+1];
}
}while(total_num>1);
//最后一个接点输出
printf("th%d person out of the line is :\t",++counter);
printf("%d\n",arry[0].joseph_num);
}


----------------解决方案--------------------------------------------------------

#include <stdio.h>
#include <conio.h>
#define M 10 /*人数,也可以修改*/
void main()
{
int a[M];
int i,k=0,count=0; /*k为已出局人数,其余控制变量*/

for(i=0;i<M;i++) /*赋值*/
a[i]=i+1;
i=0;
while(k<M-1) /*k最大8人,执行为这个回合就是出局9人,留下一人*/
{
if(a[i]!=0)
count++;
if(count==3) /* 数3的出局,把出局元素值设为0*/
{
a[i]=0;
k++;
count=0;
}
i++;
if(i==M) /*如果数到数组末,返回数组头*/
i=0;
}
i=0;
while(a[i]==0) /*跳过出局元素*/
i++;

printf("The %dth is left.\n",i+1); /*输出*/
getch();
}


----------------解决方案--------------------------------------------------------
看看下面两个连接,也许有帮助:
http://bugeyes.blog.edu.cn/user1/20989/archives/2005/986599.shtml
http://bugeyes.blog.edu.cn/user1/20989/archives/2005/991395.shtml

----------------解决方案--------------------------------------------------------

楼住刚学C语言?这题好象要用循环链表,
是《数据结构》中的内容


----------------解决方案--------------------------------------------------------
不用那么麻烦
----------------解决方案--------------------------------------------------------
#include<stdio.h>
main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10},b[10],i;
for (i=0;i<=9;i++)
{
if ((i+1)%3!=0)
{b[i]=a[i];
printf ("%d\n\n",b[i]);}
}
}

唉,感慨! 我想了差不多1小时多,羞盔....

[此贴子已经被作者于2006-2-11 22:10:09编辑过]


----------------解决方案--------------------------------------------------------
晕,三楼的完全看不懂啊
----------------解决方案--------------------------------------------------------
8楼的好象不用这个数组b[]接受数字吧,直接用一个int变量就行啊
----------------解决方案--------------------------------------------------------
  相关解决方案