当前位置:首页 » 编程语言 » 约瑟夫问题c语言数组

约瑟夫问题c语言数组

发布时间: 2022-07-08 16:24:38

c语言解决约瑟夫死亡游戏问题,用calloc函数和数组,要求简洁明了。

bool a[101]={1}; //a[i]表示第i人还活着
int n,m,i=0,s=0,t=0;
cin>>n>>m; //人数n,报数m
do
{
i=i%n+1; //数组模拟环状
if(a[i])t++; //第i个人还活着则报数
if(t==m) //当前报的数是m
{
s++; //死亡人数+1
cout<<i<<'\t'; //输出被杀人编号
a[i]=0; //此处人已死,设置为0
t=0; //计数器清零
}
}while(s!=n); //直到所有人都被杀死为止

⑵ C语言中用数组解约瑟夫问题

#include<stdio.h>

#include<stdlib.h>

void main()

{

int y(int n,int m);

int p,q,r;

printf("请输入参选人的个数p和开始的位置q: ");

scanf("%d%d",&p,&q);

r=y(p,q);

printf("最后那个人的初始位置是:%d ",r);

}

int y(int n,int m)

{

int i,j=0,s=0,l;

int *a=(int *)malloc(sizeof(int));

int *b=(int *)malloc(sizeof(int));

for(i=0;i<n;i++)

{

a[i]=i+1;

}

a[n]=-1;

for(i=0;j!=n;i++)

{

if(a[i]==-1)

i=0;

if(a[i]!=0 && a[i]!=-1)

s++;

if(s==m)

{

b[j]=a[i];

a[i]=0;

j++;

s=0;

}

}

for(i=0;i<n;i++)

{

printf("%5d",b[i]);

}

printf(" ");

l=b[n-1];

return l;

}

(2)约瑟夫问题c语言数组扩展阅读:

大体思路如下:

①、read(a)

②、b:=1,c:=1{b为某一组的元素个数,c为累计所加到的数}

③、while c<a do (b:=b*2,c:=b+c){超过目标时停止加数}

⑥、c:=c-b{退到前一组}

⑦、x:=a-c{算出目标为所在组的第几个元素}

⑧、ans:=x*2-1{求出该元素}

⑨、write(ans)

⑶ 约瑟夫问题 c语言数组

用数组,结构体都可以来完成,呵呵
int a[300]={1}; 赋值一个都是1的数组,用多少,取多少用
int i=0,n,m,k,t;
scanf("%d %d",&n,&m);
t=m;

for(i=0,k=0;t!=1;i++) //死循环 //用t计数,当t成为1时,退出循环

{
if(i==n) //完成首尾的衔接

i=0;
if(a[i]!=0) //数一个

k++;
if(k==m) //如果数到m个,则把这个赋值为0.标记这个出局
{

a[i]=0;
k=0; //如果判断为k%m==0,则这一句可以不要
t--; //记录还有几个没有出局的

}

}

链表,判断条件就是next指针指向自己,呵呵
原理差不多,自己写吧

⑷ C语言编程问题:约瑟夫问题求解

用一个循环链表就可以完成了!
#include<stdio.h>

struct node{
int data;
struct node *next;
}node,*list,*p,*r;

void JOSEPHU(int n,int k,int m)
{
int i,j;
list=NULL;
for(i=1;i<=n;i++)
{
p=(struct node*)malloc(sizeof(node));
p->data=i;
if(list==NULL)
list=p;
else
r->next=p;
r=p;
}
p->next=list; /*建立一个循环链表*/

p=list;
for(i=1;i<=n+1;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n"); /*打印链表,并检查循环链表是不输入正确*/
p=list;
i=1;
while(p&&i<k)
{ r=p;
p=p->next;
++i;
}
for(i=1;i<n;i++)
{
for(j=1;j<m;j++)
{ r=p;
p=p->next;
}
printf("The out=%d\n",p->data);
r->next=p->next;
}
}
void main()
{
int x, y, z;
printf("input the lenth n\n");/*n,k,m分别代表总的人数,第一个报数的人,间隔的人数*/
scanf("%d",&x);
printf("input the start k\n");
scanf("%d",&y);
printf("input the m\n");
scanf("%d",&z);
JOSEPHU(x,y,z);
}

⑸ 数据结构中的约瑟夫环问题用C语言怎么编写出来啊

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出
圈子,问最后留下的是原来第几号的那位。
1.
程序分析:这是一个比较经典的算法--约瑟夫环问题.
2.个人分析:
算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法
则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了
相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本
人写的代码不会叫大家啐骂!
3.程序源代码:
#include
<stdio.h>
#define
N
50
#define
S
3
void
main()
{
int
a[N];
int
i,k;
int
sum=N;
k=0;
for(i=0;i<N;i++)
a[i]=i+1;
for(i=0;i<N;i++)
printf("%-4d",a[i]);
printf("\n");
for(i=0;;i++)
{
if(sum==1)
break;
if(a[i%N]!=0)
{
k++;
}
if(k==S)
{
k=0;
//printf("%4d",a[i%N]);
a[i%N]=0;
sum--;
}
}
for(i=0;i<N;i++)
if(a[i]!=0)
printf("\n最后一个数为:%d\n",a[i]);
}
两年前念书的时候写的,献丑了!

⑹ 约瑟夫问题c语言

#include<stdio.h>
#define size 100 /* 输入人数的上限 */
void main()
{
int person[size];
int i, j; /* 循环修正变量 */
int arrayLen; /* 数组长度 */
int start, overNum; /* 开始位置各跨过位置 */
int deleNum; /* 出列人所在数组中的下标 */
int name, total; /* 输入时,人的信息以及人的总数 */
printf( "请输入圆桌上人的总数: " );
scanf( "%d", &arrayLen ); printf( "\n" );
if( ( arrayLen > size ) || ( arrayLen < 0 ) )
{
printf( "超出范围,请重新输入: " );
scanf( "%d", &arrayLen ); printf( "\n" );
};
printf( "请输入各个人的信息(整数): \n" );
for( i = 0; i < arrayLen; i++ )
{
scanf( "%d", &name );
person[i] = name;
}
printf( "你输入的数据的顺序为: \n" );
for( i = 0; i < arrayLen - 1; i++ )
printf( " %d ==>", person[i] );
printf( "%d \n", person[arrayLen - 1] );
printf( "你打算从第几个人开始? 请输入开始号: " );
scanf( "%d", &start );
printf( "\n" );
start = start - 1;
printf( "请输入相邻两出列人之间的间隔: " );
scanf( "%d", &overNum );
printf( "\n" );

total = arrayLen;
printf( "程序运行后,出列人的顺序为:\n\n" );
for( i = 0; i < total; i++ ) /* 要打印total个人的情况,故做total次 */
{
if ( arrayLen == 1 )
printf( "%d", person[0] ); /* 如果是数组只剩一个元素,直接出列 */
else
{
deleNum = ( start + overNum - 1 ) % arrayLen; /* 此取模保证循环 */
printf( "%d ==> ", person[deleNum] );
for ( j = deleNum; j < arrayLen; j++ ) /* 将出列元素后面的各元素前移 */
person[j] = person[j+1];
start = deleNum;
arrayLen = arrayLen - 1; /* 移动完毕后,数组长度减1 */
}
}
printf( "\n\n" );
}

从一本数据结构书上看到的用向量实现此问题:
void Josephus (Vector <int> &P, int n, int s, int m)
{
//将人员编号存入向量P;
int k = 1;
for(int i = 0; i<n, i++)
{P.Insert(k,i); k++;}
int s1 = s;
for(int j = n; j>=1; j--)
{
s1=(s1+m-1)%j;
if(s1== 0) s1 = j;
int w = P.Getnode(s1 - 1);
P.Remvoe(s1 - 1);
P.Insert(w,n-1);
}
}
以前学C语言的时侯写的,希望对你有用。

⑺ 求解用C语言数组实现约瑟夫环问题

如果只需要结果的话可以把数到3的人置零,然后输出不是零的数就OK了
或者
可以先数学递推一下,比模拟效率高多了~~!!
具体的看我空间这直接给你代码吧
#include <stdio.h>
int main()
{
int n, m, i, s=0;
printf ("N M = "); scanf("%d%d", &n, &m);
for (i=2; i<=n; i++) s=(s+m)%i;
printf ("The winner is %d\n", s+1);
}

⑻ C语言,编了一个程序解决约瑟夫环问题(数组模拟1代表有人,0代表走了)下面的代码对吗

#include<stdio.h>
#defineN10
intmain()
{
inta[N];
inti,people=N,n=0;
for(i=0;i<N;i++)
a[i]=1;
i=0;
while(people>0)
{
if(a[i]==1)//非0的才统计
n++;
if(n==3)
{
a[i]=0;
people--;
printf("第%d个人离开 ",i+1);
n=0;
}
i++;
if(i==N)
i=0;
}
return0;
}

热点内容
滑板鞋脚本视频 发布:2025-02-02 09:48:54 浏览:432
群晖怎么玩安卓模拟器 发布:2025-02-02 09:45:23 浏览:557
三星安卓12彩蛋怎么玩 发布:2025-02-02 09:44:39 浏览:743
电脑显示连接服务器错误 发布:2025-02-02 09:24:10 浏览:537
瑞芯微开发板编译 发布:2025-02-02 09:22:54 浏览:146
linux虚拟机用gcc编译时显示错误 发布:2025-02-02 09:14:01 浏览:235
java驼峰 发布:2025-02-02 09:13:26 浏览:651
魔兽脚本怎么用 发布:2025-02-02 09:10:28 浏览:538
linuxadobe 发布:2025-02-02 09:09:43 浏览:212
sql2000数据库连接 发布:2025-02-02 09:09:43 浏览:726