首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-08-26 
一个类似约瑟夫环的程序,求高手指点...问题描述:输入一个由随机数组成的数列(数列中每个数均是大于0的整数

一个类似约瑟夫环的程序,求高手指点...
问题描述:
输入一个由随机数组成的数列(数列中每个数均是大于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次。

热点排行