标题:程序有问题啊
只看楼主
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
 问题点数:0 回复次数:10 
程序有问题啊
有N个人坐成一圈,从S个人开始报数,当报到J的时候 删除这个J位置的人,一直删到最后剩一个时候停止,求出剩下的是哪个人。假设:人用数组表示a[N]={0,1,2,3,4,5,6,7,8,9};

下面是我的程序,但是有错误,我编的时候也比较混乱可以我觉得我的算法应该是对的,望大家帮我找出错误谢谢。斑竹也对我的程序评价一下啊
PS:最好 是按我的算法来做 如果算法有问题请指出不要用链表


#include <iostream>
using namespace std;
#define N 10;
void del(int q) 这个函数是删除J位置的人 q是指针 指向J
{ int *p=q;
while(*p!='/0') 判断是否到串尾
{*q=*(p+1);q++;p++;} 删除 J位置的人
*q='/0';
}
void fine(int a,int s,int j) 找出J所在的位置
{ int i=1; 定义一个记数变量
int *p=&a[s]; 从S位置开始
while(i<=j) 判断是否报到J
{if(*(p+i)=='/0') 判断是否到串尾
*(p+i)=a; 到串尾让它掉头继续报直到报到J
i++;
}
del(*(p+i)); 因为报到了J 所要调用删除函数删除J位置的人
}
int main()
{int a[N]={0,1,2,3,4,5,6,7,8,9},s=3,j=2;
while(N!=1)
{fine(*a,s,,j);
N--;}
return 0;
}

[此贴子已经被作者于2006-8-11 16:56:36编辑过]

搜索更多相关主题的帖子: 算法 void include color 
2006-08-11 13:21
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 
不好意思
完全没看懂
例如
int q
int *p=q;
while(*p!='/0')
???

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-08-11 15:56
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 
你看这样行不行
例如10个人
设一个10个人的
你再设一个九个的数组N-1
把刨出来的人放9个的里面,数组赋-1,不会出现在10个里面的
然后在遍历的时候如果这个数在9个的数组里出现
就continue

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-08-11 15:59
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
得分:0 
大家来看看啊 再不看就沉了啊

2006-08-12 21:54
DarkHero
Rank: 1
等 级:新手上路
威 望:2
帖 子:191
专家分:0
注 册:2006-1-14
得分:0 

你的真乱……看不大懂,呵呵,我学数据结构的时候做过,用JAVA实现的,基本差不多,我给贴上来啊~~
(这个叫约瑟夫问题吧)
一、用数组实现:
[CODE]
public class Josephus
{
int totalNum,startNum,nextDis;

int[] array;


Josephus()
{
this(0,0,0);
}
Josephus(int totalNumber,int startNumber,int nextDistance)
{
array=new int[totalNumber];
for(int i=0;i<array.length;i++) //initialize array={1,2,...,totalNum}
array[i]=i+1;

totalNum=totalNumber;
startNum=startNumber;
nextDis=nextDistance;
array[startNumber-1]=0; //initialization
}



public int chooseWho()
{
int index=startNum-1;

for(int i=0;i<array.length-2;i++)
{
index=indexAdvance(index);
}
index=indexAdvanceOnce(index);

return index+1;
}



private boolean isAtEnd(int index) //judge whether at array-end
{
return index==array.length-1;
}



private int indexAdvanceOnce(int index) //index only advances one time,return new index
{
for(;;)
{
if(isAtEnd(index))
{
index=0;
}

else index++;

if(array[index]!=0) break;
}

return index; //because not void
}



private int indexAdvance(int index) //index advances nextDis time(s),return new index
{
for(int i=0;i<nextDis;i++)
index=indexAdvanceOnce(index);
array[index]=0;

return index;
}
}

//测试:
class TheDriver
{

public static void main(String[] args)
{
System.out.println("---------------------------------------------------------------------");
System.out.println("*本程序用于测试 Josephus.class");
System.out.println("*您可以直接修改该测试文件中的数据,以完成其他测试");
System.out.println("*测试使用了幻灯片上的例子,即:一共8人,从第3人开始数,每隔2人数一下");
System.out.print("\n结果:应该选第 ");

Josephus test=new Josephus(8,3,3);
System.out.println(test.chooseWho()+" 人\n");
}
}
[/CODE]


for( ; me.alive() ; ) { 淡泊名利,志存高远 } //Forever
2006-08-12 23:57
DarkHero
Rank: 1
等 级:新手上路
威 望:2
帖 子:191
专家分:0
注 册:2006-1-14
得分:0 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
========================================================================================

目 的

用数组求解约瑟夫问题。
因为数组不能增删,所以本程序将删除的人对应的数组元素清零。

========================================================================================

内 容

本程序共包含2个类:Josephus.class 和 TheDriver.class(driver class)。

========================================================================================

每个类的概述
----------------------------------------------------------------------------------------
1.Josephus.class

*变量介绍
int[] array:数组长度为人数总和,值为{1,2,……,人数总和}。
int totalNum:人数总和。
int startNum:开始报数的那个人的编号。
int nextDis:相临报数人的编号的差值,即如果本次报数人为5号,则下个报数人为 5+nextDis 号。

*构造方法
Josephus(int totalNumber,int startNumber,int nextDistance)
首先给数组array初始化,然后再给类变量赋值,最后将初始报数人对应的位置清零。
Josephus()
this(0,0,0)。

*函数介绍
本类不算构造方法共包含 4 个函数,其中只有 int chooseWho() 为 public。

1.boolean isAtEnd(int index)
检查 index 是否位于数组末尾。如果是,则返回 true。
2.int indexAdvanceOnce(int index)
将 index 只向后移动一位,直到遇到非0的元素为止,而且如果到达数组末尾则从头再来,
返回新的 index。
3.int indexAdvance(int index)
将 index 向后移动 nextDis 位,并将新的 index 位置的元素清零,返回新的 index。
4.int chooseWho()
先将 index 初始化为开始报数人的编号-1,因为 index 对应的是数组操作。
因为开始报数的人在创建对象时已经被清零了,所以这里需要 indexAdvance 总人数-2 次。
最后再 indexAdvanceOnce 1次,则 index 就指向最后留下的那个人了。
返回最后留下的人的编号=index+1。

----------------------------------------------------------------------------------------
2.TheDriver.class

只包含一个main()函数。
使用了幻灯片上的例子作为参数,如果想测试其他的数据可以直接修改。
没用从键盘输入是因为不方便,还不如直接改文件来得快。
经过多次测试,没发现问题。

========================================================================================
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


for( ; me.alive() ; ) { 淡泊名利,志存高远 } //Forever
2006-08-12 23:59
DarkHero
Rank: 1
等 级:新手上路
威 望:2
帖 子:191
专家分:0
注 册:2006-1-14
得分:0 
链表的就不发了,好象楼主要求用数组,以前的代码,都忘差不多了~~~~~~~~~~~

for( ; me.alive() ; ) { 淡泊名利,志存高远 } //Forever
2006-08-13 00:01
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 

俺觉得俺那方法不错啊


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-08-13 00:50
aen0716
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2006-7-19
得分:0 
在帮你顶一下
2006-08-13 14:13
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 

大概我说的不清楚
有点省略了



你看这样行不行
例如n个人
设一个n个人的数组
你再设一个N-1个的数组
把刨出来的人放nN-1个的数组里面,数组赋-1,只要保证N的数组里没有就行
然后在遍历的时候10个数
每次都测试一边 例如如果测试是第M个人是要出去的
而这个数在N-1个的数组里出现
就continue
测试这个数的下一个 直到这个数在N-1没有,然后把这个数放进N-1里面
然后进行下一次遍历 没有链表


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-08-13 14:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-83402-1-1.html




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

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