社区
C语言
帖子详情
请教一道编程题
KingI
2003-10-19 10:53:07
有n个人按顺序排成一个圆圈,开始报数(从1到3),报到3的人退出圆圈,问:最后剩下的那个人是原来的第几号?
...全文
67
7
打赏
收藏
请教一道编程题
有n个人按顺序排成一个圆圈,开始报数(从1到3),报到3的人退出圆圈,问:最后剩下的那个人是原来的第几号?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sky_apple
2003-10-19
打赏
举报
回复
//josephus问题是说,一群小孩围成一圈,任意假定一个数m,从第一个小孩起,
//顺时针方向数,每数到第m个小孩时,该小孩离开,小孩不断离开,圈子不断缩小
//最后一个小孩便是胜利者。究竟是第几个小孩呢?
#include<iostream>
using namespace std;
void main()
{
//建立小孩数组
const int num=0;//小孩数
int interval;//每次数interval个小孩,便让小孩离开
int a[num];//小孩数组
//给小孩编号
for(int i=0;i<num;i++)//小孩的编号只与小孩数有关
a[i]=i+1;
//输入数小孩间隔
cout<<"please input the interval:";//输入一个小孩个数
cin>>interval;
//将全体参加的小孩输出
for(int i=0;i<num;i++)//顺序输出开始时的小孩编号
cout<<a[i]<<","<<endl;
int k=1;//标识处理第k个离开的小孩
int i=-1;//数组下标(下一个值0就是第一个小孩的下标)
//处理获胜的小孩
while(1)
{
//在圈中数interbal个小孩
for(int j=0;j<interval;)
{
i=(i+1)%num;//对下标加1求模
if(a[i]!=0)//如果该元素的小孩在圈中,则承认数数有效
j++;
}
if(k==num) break;//该小孩是最后一个(胜利者)吗?
cout<<a[i]<<",";//输出离开的小孩编号
a[i]=0;//表示小孩已经离开
k++;
//预备处理下一个小孩
}
//break语句跳转到此
cout<<"\nNo."<<a[i]<<"boy's won.\n";//输出胜利者
cin.get();
}
pxwzd123
2003-10-19
打赏
举报
回复
约瑟夫环问题
约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。
#include <stdlib.h>
#include <alloc.h>
struct node
{
int number; /* 人的序号 */
int cipher; /* 密码 */
struct node *next; /* 指向下一个节点的指针 */
};
struct node *CreatList(int num) /* 建立循环链表 */
{
int i;
struct node *ptr1,*head;
if((ptr1=(struct node *)malloc(sizeof(struct node)))==NULL)
{
perror("malloc");
return ptr1;
}
head=ptr1;
ptr1->next=head;
for(i=1;i<num;i++)
{
if((ptr1->next=(struct node *)malloc(sizeof(struct node)))==NULL)
{
perror("malloc");
ptr1->next=head;
return head;
}
ptr1=ptr1->next;
ptr1->next=head;
}
return head;
}
main()
{
int i,n=30,m; /* 人数n为30个 */
struct node *head,*ptr;
randomize();
head=CreatList(n);
for(i=1;i<=30;i++)
{
head->number=i;
head->cipher=rand();
head=head->next;
}
m=rand(); /* m取随机数 */
i=0; /* 因为我没办法删除head指向的节点,只会删除head的下一节点,所以只能从0数起。*/
while(head->next!=head) /* 当剩下最后一个人时,退出循环 */
{
if(i==m)
{
ptr=head->next; /* ptr记录数到m的那个人的位置 */
printf("number:%d\n",ptr->number);
printf("cipher:%d\n",ptr->cipher);
m=ptr->cipher; /* 让m等于数到m的人的密码 */
head->next=ptr->next; /* 让ptr从链表中脱节,将前后两个节点连接起来 */
head=hea/d->next; /* head移向后一个节点 */
free(ptr); /* 释放ptr指向的内存 */
i=0; /* 将i重新置为0,从0再开始数 */
}
else
{
head=head->next;
i++;
}
}
printf("number:%d\n",head->number);
printf("cipher:%d\n",head->cipher);
free(head); /* 让最后一个人也出列 */
}
是这个问题的简化版本吧,以前的程序。
ttlb
2003-10-19
打赏
举报
回复
// C语言版
#include <stdio.h>
void josephus(int iTotal, int iInter)
{
static int *iArr = new int[iTotal];
int j = 0; // j:间隔数iInter的游标
int iOut = 0;
for (int i = 0; ; ++i) // i:全部小孩iTotal的游标
{
i %= iTotal;
if (1 == iArr[i]) // 已经出去了
continue;
++j; // 此位置上的小孩还没有出去,j++;
if (iInter == j) // 已经输了iInter 个小孩,让这个小孩出去
{
iArr[i] = 1;
j = 0;
++iOut;
printf("%d\n",i);
}
if (iTotal == iOut) // 全出去了
return;
}
}
int main()
{
int iTotal = 0, iInter = 0;
printf("input total number: ");
scanf("%d",&iTotal);
printf("input internal: ");
scanf("%d",&iInter);
josephus(iTotal, iInter);
return 0;
}
ttlb
2003-10-19
打赏
举报
回复
http://expert.csdn.net/Expert/topic/2367/2367799.xml?temp=.9312097
不是已经问过了吗?
danpianji2002
2003-10-19
打赏
举报
回复
约瑟夫问题
akiko
2003-10-19
打赏
举报
回复
http://paddy.myrice.com/program/34.htm
leyt
2003-10-19
打赏
举报
回复
是想要个程序吗
牛客网数据开发题库_
请教
牛客网
一道
在线
编程题
,为什么c语言通过不了
#define _CRT_SECURE_NO_WARNINGS#include int main(void){int a[30000] = { 0 }, b[30000] = { 0 }, N, M, i, j, x = 0, y = 0, k, max, q = 0;char letter = '0';while (scanf("%d %d", &N, &M))...
「网易互娱-21前端开发工程师」笔试题 四道
编程题
(仅A了
一道
...)
A.数组重排(过了37%左右) 题目描述 给两个整数A、B,位数N,B可以进行重排,然后满足A<B的最小B 没有就输出-1 测试样例 /* 给两个整数A、B,位数N,B可以进行重排,然后满足A<B的最小B 没有就输出-1 */ /* 3 123 322 223 3 421 123 -1 */ 做题思路 我的想法是,通过 dfs 排列组合所有 B 的情况,然后求大于 A 的最小的那个。其中还对组合进行了去重,但是只过了 37%左右。难道是数据原因? 我的代码 let n = par
2017.07.28 第三天 心情复杂的一天
先说点儿废话,我妈让我这样一个没有艺术细胞的人去学舞蹈,想要学好不存在的哈哈哈,舞蹈真的好难,比数学还难~~o(>_<)o ~~ 恩接下来进入正题,今天真的无法形容,无比纠结,做的每
一道
编程题
都得仔细琢磨……大多数题完成以后都有错误啊心塞:-X。尤其是你改了好几遍,可它还是错的,我还记得第一天学长说过,
一道
编程题
推敲下来可能会消耗你很多时间,真的真的真...
一道
笔试题的代码实现,请多多
请教
。
导读: 前些日,遇到这么个笔试题: 任选一种语言,写一段程序,将实数转成中文大学金额。如1234.12转成壹仟贰佰叁拾肆元壹角贰分。 大家觉得这题目是简单还难?是否有把握在一个小时内正确编码实现?我当时刚拿题目,觉得有几个难点。当场没实现完整。回到家好好用c#写了一遍,大家评说一下这代码实现如何?请多多
请教
。 转化的时候我遇到个郁闷,就是一兆等于多少亿,姑且按一兆等于亿亿来
简单的
一道
SQL 题,谈如何提高编程水平
点击蓝色“有关SQL”关注我哟加个“星标”,天天与12238人一起快乐成长前两天发了一篇《SQL的3列4种对比方法》,近500 阅读。一个月没更文了,没想到朋友们都还关注着,我很激动,非常感谢。这题是工作中的一个实战题,求维度建模中数据的完整性。因为投行的数据敏感性,我就用阿里的天池竞赛数据,改造了下。所以有几处地方,被我们微信群里的 xuhui 大佬看出来有瑕疵。在这要...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章