带密码的约瑟夫问题

带密码的约瑟夫问题:编号为1,2,…,n的n个人按照顺时针方向围坐一圈,每个人有自己的编号(正整数)、姓名和密码(正整数)三个数据项。一开始任选一个正整数作为报数上限值,从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出队为止。设计一个程序来求出出队顺序。

输入格式:

输入人数 n(1≤n≤50),再逐行输入每个人的信息(各项之间用逗号隔开),然后输入报数上限值m。

输出格式:

按出队顺序逐行输出每个人的信息,每人信息一行,数据项之间用逗号隔开

输入样例:

在这里给出一组输入。例如

5
1,刘三,3
2,李丽,5
3,吴勇,8
4,钱多,2
5,齐民,4
2

输出样例:

在这里给出相应的输出。例如:

2,李丽,5
3,吴勇,8
5,齐民,4
4,钱多,2
1,刘三,3

各项之间用逗号隔开

scanf的时候,如果需要输入字符串,逗号隔开就失去了功能,因为scanf会把空格、逗号当作字符串(字符数组)的一部分,利用正则表达式可以实现逗号隔开的功能,如:

int a;
char b[20];
int c = 0;
scanf("%d,%[^,],%d",&a,b,&c);

printf的时候,逗号就是隔开的功能,

printf("%d,%s,%d",a,b,c);
printf("%d %s %d",a,b,c);

完整代码

//带密码 的约瑟夫问题
#include<stdlib.h>
#include<stdio.h>
typedef int ElemType1;

//定义节点
typedef struct node{
	ElemType1 num;
	char name[10];
	ElemType1 password;
	struct node *next;	
} LNode;
typedef struct node *Linklist;

//单链表初始化
Linklist ListInit(){
	Linklist list;
	list = (Linklist)malloc(sizeof(LNode));
	return list;
} 

//添加链表元素
void InsertList(int n,Linklist list){	
	int i;
	//插入元素 
	Linklist p = list;
	for(i=0;i<n;i++){
		scanf("%d,%[^,],%d",&p->num,p->name,&p->password);
			
		p->next = (Linklist)malloc(sizeof(LNode));
		
		//圆环 
		if(i==n-1)
			p->next = list;
		else
			p = p->next;			
	} 	
} 

//报数出队 
void PassGroup(Linklist list,int m,int n){
	Linklist p = list;
	Linklist q ;//记录出队的人员
	int i;
	while(n!=0){
			//p即将出队伍的人 ,q为前面的 
	 		for(i=1;i<m;i++){	
				q = p;
				p = p->next;
			}
			m = p->password;
			printf("%d,%s,%d\n",p->num,p->name,p->password);
			q->next = p->next;
			p = p->next;	
			n--;		
	} 		
} 


int main(){
	int n,m;
	scanf("%d",&n);
	if(n<=0)
		return 0; 
	
	Linklist list;
	
	list = ListInit();
	
	InsertList(n,list);
//	ListTraver(list,n);
	
	scanf("%d",&m);
	if(m<=0)
		return 0;
	
	PassGroup(list,m,n);
	
	return 0;
}
	
	
	
	
  • 11
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值