读书人

一个类似约瑟夫环的程序求.

发布时间: 2013-08-26 12:17:40 作者: rapoo

一个类似约瑟夫环的程序,求高手指点...
问题描述:
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。
比如:输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。

以上的描述,下面是我写的代码,只打印出第一次执行的情况就结束了。请各位指出问题在哪?
void array_iterate(int len, int input_array[], int m, int output_array[]){ //m为第一次要出局数字的位置
int pos = 0; //要出局数字的位置,初始0
int j = 0; //output_array[]的下标
int tmp = 0; //保存上一次出局数字的位置
int flag = 0; //记录已出局数字的个数
while(flag > 10) //出局数字大于10时停止
{
if(pos >= 9){ //位置大于数组长度,取余
pos = pos%10;
}else{
pos = tmp+(m-1); //这一次要出局的位置
}
if(tmp >= 10-i){ //tmp大于等于数组剩下的长度,取余
tmp = tmp%10;
}else{
tmp = i+1; //这一次的位置保存进临时变量
}
m = input_array[i]; //m变化为该位置的值
printf("\n出局数为%d,m变为%d",input_array[i],m);
output_array[j] = input_array[i]; //出局的数字保存在输出数组中
j++;
input_array[i] = 0; //出局的数字置零,表示出局
flag++; //置零标志加1
}


}

[解决办法]
仅供参考

//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
while (1) {
printf("Input n m(1000>=n>=m>=1):");
fflush(stdout);
rewind(stdin);
if (2==scanf("%d%d",&n,&m)) {
if (1000>=n && n>=m && m>=1) break;
}
}
t=0;//已出圈总人数
i=1;//座位编号
k=1;//当前要数的数
while (1) {
if (0==f[i]) {
if (m==k) {
t++;
f[i]=1;
printf("%3d ",i);
if (0==t%10) printf("\n");
if (t>=n) break;
}
k++;if (k>m) k=1;
}
i++;if (i>n) i=1;
}
cprintf("Press any key ...");
getch();
}

------解决方案--------------------


大致看了一下,有个问题:坐标计算不对。
第一次没有数据出列的时候,计算的坐标是对的。
出列后,这个位置空了,下次计数的时候不应该把这个位置也算进去。
也就是说,出列后,数组长度应该是-1了,而数组中原本 A[7]的位置,实际上应该是A[6]了。
直接用 pos = tmp+(m-1); //这一次要出局的位置
显然错误。
还有
while(flag > 10) //出局数字大于10时停止
条件错误,应该是 flag < 10 ,第十个就应该停止了(从你程序分析数组开始是10个元素)
[解决办法]
以上的描述,下面是我写的代码,只打印出第一次执行的情况就结束了。请各位指出问题在哪?
-----------------------------------
就是上面说的 while(flag > 10) 条件错误。
第一次出列,flag = 1, 不满足while条件(满足才执行),退出,所以只执行1次。

读书人网 >C++

热点推荐