C语言编程 约瑟夫环问题
答案:2 悬赏:20 手机版
解决时间 2021-06-05 19:42
- 提问者网友:不要迷恋哥
- 2021-06-05 03:38
C语言编程 约瑟夫环问题
最佳答案
- 五星知识达人网友:北城痞子
- 2021-06-05 04:47
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a[100];
int n,r,ctor,u;
int call(int a[],int real,int u);
for(n=0;n<=99;n++)a[n]=0;
printf("/约瑟夫环 JOSEPHUS/\n\n");
printf("输入参与报数的人数\n");
scanf("%d",&r);
printf("输入报数上限\n");
scanf("%d",&u);
ctor=1;
for(n=0;n<r;n++)
{
*(a+n)=ctor;
ctor++;
if(ctor>u)ctor=1;
}
call(a,r,u);system("pause");
}
int call(int a[],int real,int u)
{
int n1,i;
int *p;
p=(a+u-1);
n1=0;i=u;
for(;n1<real-1;p++)
{
if(p>(a+real-1))p=a;
if(*(p)!=0)
{
if(i>u)i=1;
if(i==u)
{
*(p)=0;n1++;
}
i++;
}
}
for(i=0;i<real;i++)
if(*(a+i)!=0)printf("所剩最后一位原来的呼号是%d\n\n",i+1);
}
《天下代码一大抄……》
#include<stdlib.h>
void main()
{
int a[100];
int n,r,ctor,u;
int call(int a[],int real,int u);
for(n=0;n<=99;n++)a[n]=0;
printf("/约瑟夫环 JOSEPHUS/\n\n");
printf("输入参与报数的人数\n");
scanf("%d",&r);
printf("输入报数上限\n");
scanf("%d",&u);
ctor=1;
for(n=0;n<r;n++)
{
*(a+n)=ctor;
ctor++;
if(ctor>u)ctor=1;
}
call(a,r,u);system("pause");
}
int call(int a[],int real,int u)
{
int n1,i;
int *p;
p=(a+u-1);
n1=0;i=u;
for(;n1<real-1;p++)
{
if(p>(a+real-1))p=a;
if(*(p)!=0)
{
if(i>u)i=1;
if(i==u)
{
*(p)=0;n1++;
}
i++;
}
}
for(i=0;i<real;i++)
if(*(a+i)!=0)printf("所剩最后一位原来的呼号是%d\n\n",i+1);
}
《天下代码一大抄……》
全部回答
- 1楼网友:怙棘
- 2021-06-05 05:18
#include<iostream> using namespace std; //本程序以从1开始数,数到3离队为例,其它情况只用少加修改 void make(int *base,int n,int pos,int c) { int j=0; cout<<"NO. "<<++c<<" 第"<<pos+1<<"位出列"<<endl;//输出 base[pos]=0;//踢掉 if(c==n)return; //出口 while(j-3) if(base[pos=(pos+1)%n]) j++;//递归点 ,每次数到几这个3就改到几 make(base,n,pos,c);//递归 } int main() { int n,c=0,pos=2;//从N开始数,则把pos改为N-1就行了. cout<<"请输入总人数"<<endl; cin>>n; int *base=new int[n]; for(int i=0;i<n;i++) base[i]=1; make(base,n,pos,c); delete[]base; system("PAUSE"); return 0; }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯