共有三種解法:我先給你一個(gè)同密碼,循環(huán)鏈表寫的吧!
在炎陵等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需制作網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,成都營銷網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),炎陵網(wǎng)站建設(shè)費(fèi)用合理。
歡迎采納并追問!
#include stdio.h
#include stdlib.h
int linktype(int n,int m) //鏈表結(jié)構(gòu)
{
int people,passord;
struct node
{
int data;
struct node *next;
}NODE;
node *p,*head,*q,*pri;
head=(node *)malloc(sizeof(struct node));//創(chuàng)建一個(gè)空表
head-next=NULL;
head-data=1;
q=head;
for(int i=2;i=n;i++)
{
p=(node *)malloc(sizeof(struct node));//讓系統(tǒng)分配一塊新的內(nèi)存
p-data=i;
p-next=NULL;
q-next=p;
q=q-next;
}
q-next=head;//建立循環(huán)鏈表
pri=q;p=head;//從head開始循環(huán)
people=0;passord=1;//出去了幾個(gè)人、記錄的密碼數(shù)
while(peoplen)
{
pri=pri-next;
p=p-next;
passord++;
if(passord==m)
{
printf("%-4d",p-data);
node *temp;
temp=p;
pri-next=p-next;
p=p-next;
free(temp);
people++;passord=1;
}
}
printf("\n");
return 0;
}
int main()
{
int n,m;
printf("請(qǐng)輸入人數(shù)和密碼");
while(scanf("%d%d",n,m)!=EOF)
{
if(m0||n0)
{
printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
continue;
}
linktype(n,m);
}
system("pause");
return 0;
}
簡單的方法就是拿一個(gè)數(shù)組來代表一個(gè)環(huán),然后模擬報(bào)號(hào)出圈的過程,直到所有人都出圈。
以下參考代碼
#include iostream
using namespace std;
int main()
{
int n,m,i,j,k;
cinnm;
int *p=new int[n];
for(i=0; in; i++)*(p+i)=i+1;//編號(hào)
for(j=k=0,i=1; kn; j=++j%n)//從左至右,重復(fù)掃描數(shù)組,直到所有人都出圈。
{
if(*(p+j)!=0)//用零來表示已出圈,出圈了不報(bào)號(hào)
{
if(i==m)//報(bào)號(hào)數(shù)與密碼相同,則出圈
{
coutj+1" ";//cout*(p+i-1)" ";//輸出編號(hào)
*(p+j)=0;//標(biāo)記已出圈
++k;//累記出圈人數(shù)
i=1;//報(bào)號(hào)重置
}
else ++i;//繼續(xù)報(bào)號(hào)
}
}
return 0;
}
問題描述:joseph環(huán)問題的一種描述是:編號(hào)為1,2,3,···,n的n個(gè)人按順時(shí)針方向圍坐一圈,每人持有一個(gè)密碼(正整數(shù))。一開始任選一個(gè)正整數(shù)作為報(bào)數(shù)的上限值m,從第一個(gè)人開始按順時(shí)針方向自1開始順序報(bào)數(shù),報(bào)到m時(shí)停止報(bào)數(shù)。報(bào)m的人出列,將他的密碼作為新的m值,從他的順時(shí)針方向上的下一個(gè)人開始重新從1報(bào)數(shù),如此下去,直至所有的人全部出列為止。試設(shè)計(jì)一個(gè)程序求出出列順序。
基本要求:利用單向循環(huán)鏈表存儲(chǔ)結(jié)構(gòu)模擬此過程,按照出列的順序印出個(gè)人的編號(hào)
測(cè)試數(shù)據(jù):m的初始值為20;n=7,7個(gè)人的密碼依次為3,1,7,2,4,8,4,首先m值為6
# include stdio.h
# define SIZE 20
int joseph(int a[],int m,int n)
{
int b[SIZE];
int i;
int flag=0;
int code;
int sum=n;
int point=0;
int num=m;
for(i=0;in;i++)
{ b[i]=i+1; }
while(sum!=0)
{
for(i=1;i=num;i++)
{ if(point=sum) point=1;
else point++;
}
num=a[point-1];
code=b[point-1];
for(i=point;i=sum;i++)
{ a[i-1]=a[i];
b[i-1]=b[i];
}
sum--;
flag++;
point--;
printf("已退出%d人,退出的人的編號(hào)為%d.\n",flag,code);
}
return 0;
}
main()
{
int m,n,i;
int array[SIZE];
printf("約瑟夫環(huán)求解,當(dāng)前設(shè)置最大人數(shù)為%d.\n",SIZE);
printf("報(bào)數(shù)上限:\n");
scanf("%d",m);
printf("總?cè)藬?shù)為:\n");
scanf("%d",n);
for(i=0;in;i++)
{
printf("第%d人的密碼為:",i+1);
scanf("%d",array[i]);
}
joseph(array, m, n) ;
return 0;
}
這是我之前做的大作業(yè),望采納。
#include?stdio.h
int?fun(int?N)
{
int?i,j,k,m;
int?a[256];
m=0;
k=0;
for(i=0;iN;i++)
{
a[i]=i+1;
}?
for(j=0;jN;)
{
if(a[j]!=0)
{
k++;
}
if(k==3)
{
m++;
if?(m?==?N)
{
printf("The?last?number?is?:?%d\n",?a[j]);
return?a[j];
}
a[j]?=?0;
k=0;
}
if(j==N-1)
{
j=0;
}
else
{
j++;
}
}
}
int?main()
{
int?M;
scanf("%d",M);
printf("%d",fun(M));
return?0;
}
你的邏輯有點(diǎn)亂,寫代碼先將程序的邏輯理順了, 否則就算程序恰巧能運(yùn)行并得到你的結(jié)果, 你也不能確定它就是對(duì)的。
程序測(cè)試OK, 你可對(duì)比一下。
#includeiostream
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
typedef int Status;
typedef double ElemType;
//-----------------------------------
//定義單向循環(huán)鏈表
typedef struct LNode
{
int number;
int data;
struct LNode *next;
}LNode, *LinkList;
//-----------------------------------
LinkList EvaluList(int n);//對(duì)單向循環(huán)鏈表進(jìn)行尾插入賦值
int size(LinkList L);//求鏈表的節(jié)點(diǎn)個(gè)數(shù)
Status ScanList(LinkList L);//遍歷單向循環(huán)鏈表
Status Joseph(LinkList L,int m);//約瑟夫環(huán)的實(shí)現(xiàn)
//-------------------------------------------------
void main()
{
int m,n;
cout"請(qǐng)輸入初始密碼(正整數(shù))和人數(shù)"endl;
cinmn;
coutendl"請(qǐng)輸入"n"個(gè)人的密碼"endlendl;
LinkList L=EvaluList(n);
coutn"個(gè)人的密碼為"endl;
ScanList(L);
coutn"個(gè)人的出列順序?yàn)?endl;
Joseph(L,m);
}
//---------對(duì)單向循環(huán)鏈表進(jìn)行尾插入賦值----------------
LinkList EvaluList(int n)
{
if(n==0)
return NULL;
int key;
cout"輸入第1個(gè)人的密碼 ";
cinkey;
LinkList L=new LNode;
L-data=key;
L-number=1;
L-next=L;
for(int i=2;i=n;i++)
{
LinkList p=new LNode;
int key;
cout"輸入第"i"個(gè)人的密碼 ";
cinkey;
p-data=key;
p-number=i;
p-next=L-next;
L-next=p;
L=L-next;
}
coutendl;
L=L-next;
return L;
}
//---------------求鏈表的節(jié)點(diǎn)個(gè)數(shù)-------------------
int size(LinkList L)
{
if(L==NULL)
return 0;
int i=1;
LinkList p=L-next;
while(p!=L)
{
i++;
p=p-next;
}
return i;
}
//---------------遍歷單向循環(huán)鏈表--------------------
Status ScanList(LinkList L)
{
LinkList p=L;
if(p==NULL)
{
cout"人數(shù)為空"endl;
return FALSE;
}
cout"第1個(gè)人的密碼 ";
coutp-dataendl;
p=p-next;
while(p!=L)
{
cout"第"p-number"個(gè)人的密碼 ";
coutp-dataendl;
p=p-next;
}
coutendl;
return TRUE;
}
//----------------約瑟夫環(huán)的實(shí)現(xiàn)-----------------------
Status Joseph(LinkList L,int m)
{
if(L==NULL)
{
cout"人數(shù)為空,出列結(jié)束"endl;
return FALSE;
}
LinkList p=L;
while(p-next!=L)
p=p-next;
for(int n=size(L); n0 ; n--)
{
cout"密碼為"m",出列編號(hào)為";
for(int i=1; i=m%n-1; i++)
p=p-next;
coutp-next-numberendl;
m=p-next-data;
LinkList q=p-next;
p-next=q-next;
free(q);
}
return OK;
}