josephus问题的实现

来源:互联网 发布:美工废物利用教案 编辑:程序博客网 时间:2024/05/18 03:49

josephus问题:n个人围坐一圈,从某个人开始数,沿顺时针方向数,数到m的人被淘汰。然后接下去数,数到m的人被淘汰。重复上述过程,知道剩下最后一个人,这个人是获胜者。(话说这个游戏可能没有王者好玩,但是总感觉吊吊的)

采用c语言实现:

实现步骤:

(1)建立一个长度位n的整形数组,存储1到n,表示n个人。
(2)用i表示数组元素下标,初始值位0.假设从i指向的元素开始数,数到m,这相当于i值增加m-1;若在数的
过程中,遇到数组的最后一个元素,则回到数组首元素继续数。这等于把数组当作一个环,为此需要对n求余。
综合起来,被删除元素的下标计算式为:i=(i+m-1)%n
(3)删除下标位i的元素。如果删除的正好是数组的最后一个元素,那么下一轮要从数组首元素开始数。 

(4)重复步骤(2)和(3)直至n=1;
(5)释放动态数组空间,返回获胜者。
 删除下标为i的元素其方法是,从下标为i+1的元素到数组最后一个元素一次向左移动一位,然后数据个数减
 一。如果删除的是数组最后一个元素,那么只需数据个数减一即可。

代码如下(本人使用的是vs2010,如果是vc的话,main()函数中把system("pause")换成return 0;)

#include<stdio.h>

#include<stdlib.h>

int josephus(int,int);//函数声明
int main() {
int num,counter;

printf("请输入两个数:");
scanf("%d%d",&num,&counter);
printf("赢家是%d号\n",josephus(num,counter));//调用函数并打印
system("pause");
}

int josephus(int n,int m) {//函数的定义,n代表人数,m代表数到第几人
int i,j,winner,*p;
p=(int*)malloc(n*sizeof(int));//动态分配数组的大小,如果没有申请到内存那么malloc返回值为NULL
if(p==NULL) {
printf("
动态空间分配失败!");

exit(1);
}
for(i=0;i<n;i++) {//第一步
p[i]=i+1;
}
i=0;
while(n>1) {//第四步
i=(i+m-1)%n;//第二步
printf("%d ",p[i]);
for(j=i+1;j<n;j++) {//第三步
p[j-1]=p[j];
}
n--;

}
winner = p[0];//所剩的最后一个人即为p[0]
free(p);//释放空间
return winner;//第五步
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 遂宁银行办信用卡怎么办 中国银行u盾冻结怎么办 京东账号被拉黑怎么办 自己配电脑系统怎么办 没有京东白条怎么办 还款银行卡丢了怎么办 注销不符合条件房地产怎么办 淘宝买东西买完就降价怎么办 闲鱼收到空包怎么办 咸鱼上没收到货怎么办 沙发颜色错了怎么办 运动鞋网面发黄怎么办 京东不让退货怎么办 第一次送美团又不会怎么办 退货把货寄错了怎么办 冰箱发动机没坏不制冷怎么办 冰箱发动机坏了怎么办 冰箱侧面有坑怎么办 冰箱门上有坑怎么办 冰箱面板磕了怎么办 信用卡寄错地址怎么办 利润低税负低怎么办 公司利润太高怎么办 狗老咬自己的脚怎么办 qq支付忘记密码怎么办 社保存钱晚了怎么办 购机发票丢了怎么办 快递已发货拒收怎么办 买家硬是不退款怎么办 余额宝利息下降怎么办 建行卡没激活怎么办 怎么办长沙银行的卡 淘宝入不了群怎么办 咸鱼上联系不上卖家怎么办 闲鱼联系不上卖家怎么办 卖家想退款要回车辆怎么办 卖家还没发货想退款怎么办 海尔冰箱无发票怎么办 苹果8没发票怎么办 购房的发票丢失怎么办 ipad密码忘了怎么办