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 ...
随机推荐
- Oracle keep详解
原题目 select * from dept where deptno=(select max(deptno) keep(dense_rank last order by count(1)) fr ...
- jQuery 实现上下,左右滑动
前几天的任务:http://t.sina.com.cn/ 的下滑效果. 渐变移动出足够的空白 -> 淡出最后一个 ->渐变移动出足够的空白 我们要做的是向左移动效果.这个效果用时需添加一 ...
- hibernate之自定义持久化实现
- myNote
源码地址 :http://450640526.ys168.com/ 编辑器是WEBBWOSER制作的 你的Internet Explorer的版本至少要是8.0的否则用不了 还有很多BUG 很多功能没 ...
- 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件[转]
上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件.一步步很详细的介绍到简单插件开发,带Servlet的插件的开发.带JS ...
- css选择器优化
css选择器优化@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@impor ...
- css培训(三)
优先级 z-index 不设置 或auto 非static z-index :0 : z-index:-1: opacity 与层叠上下 opacity:.9 对其影响 小于1值 不具备堆叠 ...
- Python之路【第二十篇】:待更新中.....
Python之路[第二十篇]:待更新中.....
- Python CMDB开发
Python CMDB开发 运维自动化路线: cmdb的开发需要包含三部分功能: 采集硬件数据 API 页面管理 执行流程:服务器的客户端采集硬件数据,然后将硬件信息发送到API,API负责将获取 ...
- android MediaCodec 音频编解码的实现——转码
原文地址:http://blog.csdn.net/tinsanmr/article/details/51049179 从今天开始 每周不定期更新博客,把这一周在工作与学习中遇到的问题做个总结.俗话说 ...