Josephus2
约瑟夫问题升级问题
编号为1~N的N个人按顺时针方向围坐一圈,每个人持有一个密码(正整数,可以自由输入),开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报道M是停止报数。报M的人出列,将他的密码作为新的M值,从他的顺时针方向上的下一个人开始从1报数,如此下去,直至所有人全部出列为止。
目前代码还没有完善,有些错误,先附上代码:
#include<stdio.h>
#include<stdlib.h> typedef int status; typedef struct node
{
status data;
status password;
struct node *next;
}LinkList; LinkList *create(int n)
{
LinkList *head,*p1,*p2;
int i; head=(LinkList *)malloc(sizeof(LinkList));
p1=head; for(i=;i<=n;i++)
{
p2=(LinkList *)malloc(sizeof(LinkList)); p2->data=i;
p2->password=rand()%+; p1->next=p2;
p1=p2;
}
p1->next=head->next; return head;
} void Josephus(LinkList *L)
{
LinkList *p1,*temp;
p1=L->next;
int i,m;
m=p1->password; while(p1!=p1->next)
{
for(i=;i<m-;i++)
{
p1=p1->next;
} printf("%d->",p1->next->data);
temp=p1->next;
p1->next=temp->next;
m=temp->password; free(temp);
}
printf("%d\n",p1->data);
printf("\n");
} int main()
{
LinkList *head,*p;
int n; scanf("%d",&n); head=create(n);
Josephus(head); /*
p=head->next;
for(int i=1;i<=n;i++)
{
printf("%d ",p->password);
p=p->next;
}
*/
return ;
}
这是修改之后的代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h> typedef int status; typedef struct node
{
status data;
status password;
struct node *next;
}LinkList; LinkList *create(int n)
{
LinkList *head,*p1,*p2;
int i; head=(LinkList *)malloc(sizeof(LinkList));
p1=head; srand((unsigned)time(NULL));
for(i=;i<=n;i++)
{
p2=(LinkList *)malloc(sizeof(LinkList)); p2->data=i;
p2->password=rand()%+;//在使用随机函数时最好先用srand()函数设置随机数种子,保证每次程序运行时随机函数产生的数不相同 p1->next=p2;
p1=p2;
}
p1->next=head->next;
p1=head->next;
free(head); return p2;
} void Josephus(LinkList *L)
{
LinkList *p1,*temp;
p1=L;
int i,m;
m=p1->password; while(p1!=p1->next)
{
for(i=;i<m;i++)
{
p1=p1->next;
} printf("%d->",p1->next->data);
temp=p1->next;
p1->next=temp->next;
m=temp->password; free(temp);
}
printf("%d\n",p1->data);
printf("\n");
} int main()
{
LinkList *head,*p;
int n; scanf("%d",&n);
head=create(n); p=head->next;
for(int i=;i<=n;i++)//输出password应该放在调用Josephus(head)之前,否则在Josephus()函数中free()时同时将password删除
{
printf("%d ",p->password);
p=p->next;
} printf("\n");
Josephus(head); return ;
}
一开始将srand()放在循环里面,导致每次产生的n个随机数都是一样的。
其实这是因为srand()函数是一个随机数产生函数,其意思就是指C语言里的随机数都是由它来控制产生的!!!如果在应用srand()函数之前就用随机函数rand(),则相当于使用了srand(1);
而将srand((unsigned)time(NULL));这条语句放在了for循环里,即是用了srand((unsigned)time(0));故此句语句不变的话,产生的随机数就不变!!!
后来就把srand()放在for循环之前。
Josephus2的更多相关文章
- JS常见算法题目
最近收集了几个经典JS题目,比较有代表性,分享一下: 1.xiaoshuo-ss-sfff-fe 变为驼峰xiaoshuoSsSfffFe function getCamelCase(str ...
- C++:顺序表类实现约瑟夫问题_密码不同
//.h #pragma once #include <iostream> using namespace std; #define MAXSIZE 100 template <cl ...
随机推荐
- Python中逗号作用的实例分析
逗号在类型转化中的使用 主要是元组的转换 例如: >>> a=11>>> b=(a)>>> b11>>> b=(a,)>& ...
- iOS开发雕虫小技之傻瓜式定位神器-超简单方式解决iOS后台定时定位
1.概述 由于公司一款产品的需求,最近一直在研究iOS设备的后台定位.主要的难点就是,当系统进入后台之后,程序会被挂起,届时定时器.以及代码都不会Run~ 所以一旦用户将我的App先换到了后台,我的定 ...
- (C#)与Windows用户账户信息的获取
Console.WriteLine(Environment.UserName); //计算机NetBIOS名称 Console.WriteLine(Environment.MachineName); ...
- boost------asio库的使用1(Boost程序库完全开发指南)读书笔记
asio库基于操作系统提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植的异步(或者同步)IO操作,而且并不要求多线程和锁定,有效地避免了多线程编程带来的诸多有害副作用. 目前asio ...
- 全栈project师?给把瑞士军刀你去砍鬼子好不好!?
来自www.techgogogo.com 编者注:本文来自Medium前三名推荐文章,发文时已经获得高达2,125个推荐,中文版由天地会珠海分舵编译.全文对当今风靡业界的"全栈xx师&quo ...
- VNC服务端自动化配置脚本
在使用阿里云的linux云主机,看到官方提供的远程连接服务器bash脚本,记录下来. 功能:自动修改系统源和安装vncserver相关的软件包,centos.redhat系列都是安装gno ...
- IIS注册.net框架及temp文件权限开放
配置好IIS服务之后,在浏览器打开localhost:xx[端口号],提示:无法识别属性 targetFramework=4.0 这是因为项目是4.0框架,配置IIS时,在应用程序池没有选择.net ...
- hibernate中使用HQL进行数据库查询
1.写的规则比较简单,我讲一下,如图Station这个不是数据库中的表,而是entity包中的类名Station,可以省略 select * 2.返回的类型自动转化为String类型,不用你自己再转化 ...
- ASP.net MVC 多语言处理
MVC多语言处理主要分两部分,一部分是Razor视图中的文字标签内容切换, 另一部分是javascript文件中的文标签内容切换. 这里分这两部分来说. View视图中的比较好做, 思路是使用资源文 ...
- 在iframe中获取iframe外的对象
parent.document.getElementById("dom ID"); $($(parent.document.getElementById("video-i ...