| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 641 人关注过本帖
标题:[求助]看不懂的代码!
只看楼主 加入收藏
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
收藏
 问题点数:0 回复次数:7 
[求助]看不懂的代码!
3、选首领(有一群人围在一圈,从第一个人开始数1、2、3,数到3者退出)
n个人围成一圈,从第一个人开始依次从1到m循环报数,当报到m的时候此人出圈,直到圈 中只剩一人为止.求最后一个人的原始编号。
int yuesefu(int n,int m)
{
int i,r=0;
for (i=2;i<=n;i++) r=(r+m)%i;
return r+1;
}
搜索更多相关主题的帖子: 代码 
2007-09-16 17:39
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
收藏
得分:0 
这个就是用拉一个循环
当能被三整除 就删除那个值

   好好活着,因为我们会死很久!!!
2007-09-16 18:22
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
收藏
得分:0 

能详细点吗?
谢谢!!


2007-09-16 19:46
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
收藏
得分:0 
回复:(爱以走远)这个就是用拉一个循环 当能被三...
能详细点吗?
多谢了!!

2007-09-16 19:47
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
搜索:约瑟夫环

Fight  to win  or  die...
2007-09-16 21:53
yandongdido
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-9-6
收藏
得分:0 

这是我在网上下的约瑟夫环问题,感觉还是不太懂拉

#define N 100
int yuesefu1(int data[],int sum,int k)
{
int i=0,j=0,count=0;
while(count<sum-1)
{
if(data[i]!=0)/*当前人在圈子里*/
j++;
if(j==k)/*若该人应该退出圈子*/
{
data[i]=0;/*0表示不在圈子里*/
count++;/*退出的人数加1*/
j=0;/*重新数数*/
}
i++;/*判断下一个人*/
if(i==sum)/*围成一圈*/
i=0;
}
for(i=0;i<sum;i++)
if(data[i]!=0)
return data[i];/*返回最后一个人的编号*/
}

void main()
{
int data[N];
int i,j,total,k;
printf("\nPlease input the number of every people.\n");
for(i=0;i<N;)/*为圈子里的人安排编号*/
{
int input;
scanf("%d",&input);
if(input==0)
break;/*0表示输入结束*/
for(j=0;j<i;j++)/*检查编号是否有重复*/
if(data[j]==input)
break;
if(j>=i&&input>0)/*无重复,记录编号,继续输入*/
{
data[i]=input;
i++;
}
else
printf("\nData error.Re-input:");
}
total=i;
printf("\nYou have input:\n");
for(i=0;i<total;i++)
{
if(i%10==0)
printf("\n");
printf("%4d",data[i]);
}
printf("\nPlease input a number to count:");
scanf("%d",&k);
printf("\nThe last one's number is %d",yuesefu1(data,total,k));
}


2007-09-17 08:12
yandongdido
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-9-6
收藏
得分:0 

看看提示吧:

由于当某个人退出圆圈后,报数的工作要从下一个人开始继续,剩下的人仍然是围成一个圆圈的,可以使用循环表,由于退出圆圈的工作对应着表中结点的删除操作,对于这种删除操作频繁的情况,选用效率较高的链表结构,为了程序指针每一次都指向一个具体的代表一个人的结点而不需要判断,链表不带头结点。所以,对于所有人围成的圆圈所对应的数据结构采用一个不带头结点的循环链表来描述。设头指针为p,并根据具体情况移动。
为了记录退出的人的先后顺序,采用一个顺序表进行存储。程序结束后再输出依次退出的人的编号顺序。由于只记录各个结点的number值就可以,所以定义一个整型一维数组。如:int quit[n];n为一个根据实际问题定义的一个足够大的整数。


2007-09-17 08:13
yandongdido
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-9-6
收藏
得分:0 

提问者看看能不看懂啦,我是有些不懂啦

/********************************************************************
created: 2006/06/14
created: 14:6:2006 17:57
filename: C:\Documents and Settings\Administrator\桌面\tmpp\josephus.c
file path: C:\Documents and Settings\Administrator\桌面\tmpp
file base: josephus
file ext: c
author: A.TNG
version: 0.0.1

purpose: 实现 Josephus 环问题
用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,
直至全部输出。写出C程序。(约瑟夫环问题 Josephus)
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

/* 结构体和函数声明 */
typedef struct _node_t
{
int n_num;
struct _node_t *next;
} node_t;

node_t *node_t_create(int n);
node_t *node_t_get(node_t **pn, int m);

/* 功能函数实现 */

/*
* name: node_t_create
* params:
* n [in] 输入要构造的链表的个数
* return:
* 返回构造成功的环形单向链表指针
* notes:
* 构造节点数量为 n 的环形单向链表
*
* author: A.TNG 2006/06/14 17:56
*/
node_t *node_t_create(int n)
{
node_t *p_ret = NULL;

if (0 != n)
{
int n_idx = 1;
node_t *p_node = NULL;

/* 构造 n 个 node_t */
p_node = (node_t *)malloc(n*sizeof(node_t));
if (NULL == p_node)
return NULL;
else
memset(p_node, 0, n*sizeof(node_t));

/* 内存空间申请成功 */
p_ret = p_node;
for (; n_idx < n; n_idx++)
{
p_node->n_num = n_idx;
p_node->next = p_node+1;
p_node = p_node->next;
}
p_node->n_num = n;
p_node->next = p_ret;
}

return p_ret;
}

/*
* name: main
* params:
* none
* return:
* int
* notes:
* main function
*
* author: A.TNG 2006/06/14 18:11
*/
int main()
{
int n, m;
node_t *p_list, *p_iter;

n = 20; m = 6;

/* 构造环形单向链表 */
p_list = node_t_create(n);

/* Josephus 循环取数 */
p_iter = p_list;
m %= n;
while (p_iter != p_iter->next)
{
int i = 1;

/* 取到第 m-1 个节点 */
for (; i < m-1; i++)
{
p_iter = p_iter->next;
}

/* 输出第 m 个节点的值 */
printf("%d\n", p_iter->next->n_num);

/* 从链表中删除第 m 个节点 */
p_iter->next = p_iter->next->next;
p_iter = p_iter->next;
}
printf("%d\n", p_iter->n_num);

/* 释放申请的空间 */
free(p_list);

system("PAUSE");
}


2007-09-17 08:14
快速回复:[求助]看不懂的代码!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.068831 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved