约瑟夫问题升级问题

编号为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的更多相关文章

  1. JS常见算法题目

      最近收集了几个经典JS题目,比较有代表性,分享一下:   1.xiaoshuo-ss-sfff-fe  变为驼峰xiaoshuoSsSfffFe function getCamelCase(str ...

  2. C++:顺序表类实现约瑟夫问题_密码不同

    //.h #pragma once #include <iostream> using namespace std; #define MAXSIZE 100 template <cl ...

随机推荐

  1. hdoj 1045 Fire Net

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  2. 数据库的发展现状与前景——NewSQL界的佼佼者,如Couchbase、Aerospike、Marklogic和 SequoiaDB,NewSQL的许多厂商,如:MemSQL、VoltDB、ScaleDB和CitusDB

    转自:http://news.sequoiadb.com/cn/Detail-id-42 2015-03-20   Strata+Hadoop World(SHW)大会是全世界最大的大数据大会之一. ...

  3. 【设计模式 - 12】之代理模式(Proxy)

    1      模式简介 1.1    定义 为其他对象提供一种代理以控制对这个对象的访问.代理对象起到中介作用,可以去掉功能服务或增加额外服务. 1.2    常见的代理模式 1)        远程 ...

  4. eclipse运行项目特别慢,出现Java heap space溢出

    在eclipse中可用为JVM设置参数:Window-->Preferences-->Java-->Installed JREs然后选中你安装的jre-->Edit--> ...

  5. asp.net 动态添加多附件上传.

    最近有人问起动态多文件上传,想要做到类似于邮箱添加附件的效果,这个功能其实比较简单,就是往form中添加file元素.在用户选择完文件后,再添加一个file控件,由于file控件过多,视觉上不好看,所 ...

  6. 移动设备、手机浏览器Javascript滑动事件代码

    以下经过本人测试成功. 测试平台:三星S5830I 操作系统:Android 2.3.6 浏览器:UC浏览器 HTML标准:HTML5 测试了三个事件:touchstart.touchmove 和 t ...

  7. Mean Shift具体介绍

    Mean Shift,我们 翻译为“均值飘移”.其在聚类,图像平滑.图像切割和跟踪方面得到了比較广泛的应用.因为本人眼下研究跟踪方面的东西,故此主要介绍利用Mean Shift方法进行目标跟踪,从而对 ...

  8. 获取文件CRC和MD5

    unit untCRCMD5; interface { 获取文件CRC校验码 } function GetFileCRC(const iFileName: string): String; { 获取字 ...

  9. OpenSSL使用指南

    OpenSSL使用指南 1     介绍 OpenSSL是使用非常广泛的SSL的开源实现.由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库. 1.1   SSL ...

  10. MySQL快捷键

    \c  clear  放弃正在输入的命令\h  help   显示一份命令清单\q   exit  或  quit  退出Mysql程序         在linux里面可以使用Ctr+D快捷键\s  ...