第一步:设计一个数组A[n],将数组的元素全部初始为0.
第二步:循环计数i和j,如果A[i]全为0则j到3就让A[i]=1,如果中间有A[i]=1,跳过这个计数,j继续增长直到3再执行A[i]=1
第三步:在第二步的同时判断i是否循环到数组的终点,即不能超过A的长度,否则将i置0继续循环遍历数组,执行第二步。
第四步:输出最后一个元素的位置+1就是最后一个人 (因为数组是从0开始计数的)
推荐两种方法:
循环链表。把链表做成一个环,设置一个当前位置的linknode指针pos,初始时pos的数据域为0,pos->next则为1,pos->next->next数据域为2,以此类推。加个计数,从1到3,每次加一操作都移动一次指针(pos=p->next),当计数为3时,从该循环链表中删除该节点(注意保存pos的前一节点,原有p->next=pos,删除时p->next=pos->next;free(pos);pos=p->next;)同时需要注意一点的是,当pos->next=pos时,表明该链表只有一个节点了,也就是你所需要的的最后留下来的那个号。
数组。先定义好一个足够长的数组,并初始化好数组的数据位(填入1~n),与上述类似,加个计数,当为3时把该数据置为一个特殊值(如0),表示已从该数组中删除。依此下去,直到剩下最后一个不为0的值就是你所需要的值(如果不考虑效率的话,每删除一个数据置0后将后边非0数据都往前移动)。
你是要求个位有三就退出吗?