请各位前辈看一下我这个程序错在哪里

这个程序是一组人循环报数,报到3的退出,求最后剩下的那个人是第几号,改了好多次都调试不成功。所以来请教各位前辈们。谢谢。
//报数,报到3的退出,求最后剩下的成员序数

#include

void function(int *a, int n)
{
int i = 0, k = 1;

while (n > 1)
{
    while (1)
    {
        if ( (a[i] != '\0') && (k != 3) && (a[i] != 0) )
        {
            i++;
            k++;
        }//end-if
        else break;
    }//end-while

    if (a[i] == '\0') i = 0;
    else if (a[i] == n+1) i++;
         else if (k == 3)
              {
                  a[i] = n;
                  k = 1;
                  i++;
                  n--;
              }
}

}

/*-----------------------------------------------------------*/
int main(void)
{
int a[100];
int i, n;

printf("amount : ");
scanf("%d", &n);

for (i = 0; i < n; i++)  a[i] = 1;

function(a, n);

for (i = 0; i < n; i++)
{
    printf("The remaining amount is %d.\n", a[i]);
}

return 0;

}


看不明白 你写的程序不对 
for (i = 0; i < n; i++) a[i] = 1; 这个是数组里面全是1,成员全是1,后面在用的时候就不明白了 
你可以直接写一个循环 让=3的a【i】的后面的往前提(for 循环 镶嵌 ) 我想到的是这些 你试试吧

看不懂你的想法。
想了一个方法。写出一个结构
struct person{
int num; //表示自己报的数
bool islive; //表示自己是否还活着,默认true,数到数字含3的都设置成false
}
int Lastnum = 1; //从1开始数 每次数到一个不含3的数,都修改Lastnum值为新值

bool check( person * p ){ …… } 定义方法检测 是否所有person 的islive 都是false,若是return true,否则 return false;

只有的那个check返回true时候,Lastnum的值是你要的值

void function(int *a, int n)
{
int i = 0, k = 1;

while (n > 1)
{
while (1)
{
if ( (a[i] != '\0') && (k != 3) && (a[i] != 0) )
{
i++;
k++;
}//end-if
else break;
}//end-while

if (a[i] == '\0') i = 0;
else if (a[i] == n+1) i++;
     else if (k == 3)
          {
              a[i] = n;
              k = 1;
              i++;
              n--;
          }

}
}
void main()
{
int a[100];
int i, n;

printf("amount : \n");
scanf("%d", &n);

for (i = 0; i < n; i++)  a[i] = 1;

function(a, n);

for (i = 0; i < n; i++)
{
    printf("The remaining amount is %d.\n", a[i]);
}

}
我并不知道你的程序运算出来的结果是否正确,这个能运行