主题:我有个很怪的问题,谢谢高手帮我解决,考试要用的啊~~
题目如下:
约瑟夫环
(问题描述)
约瑟夫问题的一种描述是:编号为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文件,因此我迷惑不解?谢谢高手
约瑟夫环
(问题描述)
约瑟夫问题的一种描述是:编号为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文件,因此我迷惑不解?谢谢高手