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

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