回 帖 发 新 帖 刷新版面

主题:我有个很怪的问题,谢谢高手帮我解决,考试要用的啊~~

题目如下:
约瑟夫环
(问题描述)
约瑟夫问题的一种描述是:编号为1,2,......n,的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任意选
一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新
的m值,从他在顺时针方向下一个人开始从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
(基本要求)
利用单向循环链表存储结构模拟此过程,按照出列顺序印出个人的编号。
(测试数据)
m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m为6(正确的出列顺序应为6,1,4,7,2,3,5)。
下面是程序:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct ManNode
{
int Number;
struct ManNode * Next;
int Password;
};

main()
{
int m;
int NumMan;
struct ManNode * Head;
void DeleteNode(int ManNumber,int number,struct ManNode * head);
struct ManNode * CreateList(int NumOfMan);
printf("please the number of people(n):");
scanf("%d",&NumMan);
Head=CreateList(NumMan);
printf("please input the first password(m):");
scanf("%d",&m);
DeleteNode(NumMan,m,Head);
free(Head);
}

struct ManNode *CreateList (int NumOfMan)
{
struct ManNode * head,*ManNodeP1,*ManNodeP2;
int Num=1;
head=NULL;
ManNodeP2=(struct ManNode *)malloc(sizeof(struct ManNode));

printf("please input the secret:");
scanf("%d,",&ManNodeP2->Password);
ManNodeP2->Number=Num;
head=ManNodeP2;

while(Num!=NumOfMan)
{
Num++;
ManNodeP1=(struct ManNode *)malloc(sizeof(struct ManNode));
scanf("%d,",&ManNodeP1->Password);
ManNodeP1->Number =Num;
ManNodeP2->Next =ManNodeP1;
ManNodeP2=ManNodeP1;
}

ManNodeP2->Next =head;
return head;
}

void DeleteNode (int ManNumber,int number,struct ManNode * head)
{
int num=1;
struct ManNode *ManNodeP1;
struct ManNode *ManNodeP2;
ManNodeP1=ManNodeP2=head;

while(ManNumber>0)
{
  while(num!=number)
  {
   ManNodeP2=ManNodeP1;
   ManNodeP1=ManNodeP1->Next ;
   number--;
  }

  number=ManNodeP1->Password;
  printf("%d,",ManNodeP1->Number) ;
  ManNodeP2->Next =ManNodeP1->Next ;
  ManNodeP1=ManNodeP1->Next ;
  ManNumber--;
}
}
这个程序做了个EXE文件,为什么我的答案一闪而过,只能在TC里面用USER SCREEN才能看见答案,我们老师要求交EXE文件,因此我迷惑不解?谢谢高手

回复列表 (共4个回复)

沙发

程序末
加个system("pause")

板凳

哇~~这个你都不知道程序你怎么写出来的?
疑惑

3 楼

有这么复杂吗?
program t1012(input,output);
const maxn=1000;
var z,mm:array[1..maxn]of integer;
     s,n,i,j,m:integer;
begin
  repeat
   read(n,m);s:=0;
   for i:=1 to n do
    begin
     read(mm[i]);z[i]:=i;
    end;
   i:=0;j:=0;
   repeat
    inc(i);
    if z[i]<>0 then inc(j);
    if j=m then begin
                 inc(s);
                 if s=n then write(z[i])
                 else write(z[i],' ');
                 z[i]:=0;j:=0;m:=mm[i];
                end;
    if i=n then i:=0;
   until s=n;
  writeln;
  until seekeof;
end.

4 楼

我也是个初学者,如果加个Delay();不知能不能解决.

我来回复

您尚未登录,请登录后再回复。点此登录或注册