2 回答

TA貢獻1816條經驗 獲得超4個贊
前面兩位都用鏈表,用鏈表解決約瑟夫問題是最好的。我這里補充用數組來解決約瑟夫問題的問題,希望能對你有幫助(我這里沒用文件操作命令,只用普通的讀寫語句)
pascal
var n,m,s,f,t:integer;
a:array[1..100] of boolean;
begin
readln(n,m);
for t:=1 to n do
a[t]:=false;
f:=0; t:=0; s:=0;
repeat
t:=t+1;
if t=n+1 then t:=1;
if a[t]=false then s:=s+1;
if s=m then
begin
s:=0;
writeln(t,' ');
a[t]:=true;
f:=f+1;
end;
until f=n;
end.

TA貢獻1836條經驗 獲得超4個贊
#include"stdio.h"
main()
{
int i,j,a[100],b[100],t,m,n;
scanf("%d%d",&n,&m);
for(i=n;i>1;i--)
{
for(t=1;t<m%i;t++)
b[t]=a[t];
for(j=m%i+1;j<=i;j++)
a[j-m%i]=a[j];
for(t=i-m%i;t<i;t++)
a[t]=b[t-i+m%i+1];
}
printf("%d",a[1]);
}
#include "stdio.h"
main()
{
int t=0,T=0,i,j,m,n,a[1000],p;
for (j=0;;j++)
{p=0;
scanf ("%d%d",&n,&m);
if (n==0||m==0)
break;
for (i=0;i<n;i++)
a[i]=1;
for (i=0;;i++)
{
if (i==n) i=0;
t=t+a[i];
if (t-m==0)
{a[i]=0;p++;t=0;if (p==n-1) break;}
}
for (i=0;;i++)
if (a[i]==1)
{printf ("%d\n",i+1);break;}
}
}
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}listnode,*linklist;
linklist creatlist(int n,linklist R)
{
listnode *p,*q;
int i;
R=q=(listnode*)malloc(sizeof(listnode));
for(i=1;i<n;i++)
{
p=(listnode*)malloc(sizeof(listnode));
q->data=i;q->next=p;q=p;
}
p->data=n;p->next=R;R=p;return R;
}
linklist deletenode(int n,int k,linklist R)
{
int i,j;listnode *p,*q;
p=R;
for(i=1;i<n;i++)
{
for(j=1;j<k;j++)
p=p->next;
q=p->next;
p->next=q->next;
free(q);
}
R=p;return R;
}
void outring(int n,linklist R)
{
listnode *p;p=R;printf("%d",p->data);
}
void main()
{
linklist R;int n,k;
scanf("%d%d",&n,&k);
R=creatlist(n,R);
R=deletenode(n,k,R);
outring(n,R);
}
- 2 回答
- 0 關注
- 283 瀏覽
添加回答
舉報