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 ...
随机推荐
- 如何设置win7系统的文件夹为系统文件,从而隐藏文件夹
1.如图所示,通过去掉勾选“隐藏受保护的操作系统文件(推荐)”和勾选“显示隐藏的文件.文件夹和驱动器”,可以查看系统所有文件
- C++ 标准时间线
Herb Sutter在他的博客上贴出了一个C++的timeline,如下所示:
- iOS开发总结-图片左右滑动浏览
// // PicViewController.m // BJ // // Created by shirenfeng on 16/9/13. // Copyright © 2016年 com.zyb ...
- android-----JNI学习 helloworld
(1)新建android工程 (2)添加NDK路径 (3)添加本地支持 给本地库起名 此时工程目录下会自动生成jni文件夹 此时Makefile也自动生成 LOCAL_PATH := $(call m ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(27)-权限管理系统-分配用户给角色
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(27)-权限管理系统-分配用户给角色 分配用户给角色,跟分配角色给用户操作是基本一致的. 打开模块维护,展 ...
- LeetCode——Linked List Cycle
Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...
- iOS 8 设置导航栏的背景颜色和背景图片
假设是storyboard 直接embed一个导航栏.然后在新出现的导航栏 选属性 选一下颜色就能够了 代码实现背景颜色改动:self.navigationController.navigationB ...
- Android自己定义控件而且使其能够在xml中自己定义属性
为什么要自己定义View android开发中自己定义View的优点是显而易见的.比方说以下的这个顶部导航,它被设计出如今应用的每一个界面,但每次的内容却不尽同样.我们不能在每一个layout资源中都 ...
- Java基础知识强化02:import static 和 import
1.import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com..... ...
- Linux写配置HDF5的python包h5py
闲言碎语不讲,直接进入正题.Python在科学计算的应用越来越丰度,而hdf(5)数据的应用也非常广泛.python提供了h5py包供开发者处理数据(http://www.h5py.org/).在wi ...