此题逻辑性比较强,需要认真思考,理清关系。下面是我的想法。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 5
int main()
{
int A[M]={2,4,7},person[N]={1,2,3,4,5}; //淘汰的人的序号记为0
int personLeft; //淘汰后剩余的人数
int index_A=0; //要淘汰的报数数组下标
int index_person=0; //抽奖人的数组下标
int luckyOne; //标记中奖人的序号
int i,j;
//先输出原始的N个抽奖人
for(i=0;i<N;i++)
{
printf("%d ",person[i]);
}
printf("\n");
do
{
personLeft=0;
j=0;
for(i=index_person;i<N;i++) //从index_person开始报数
{
if(person[i]!=0) j++; //没有淘汰的人依次报数并统计
if(j==A[index_A]) //当统计的报数等于要淘汰的报数
{
person[i]=0; //将报此数的人淘汰
if((N-1)==i) i=-1; //如果此人恰好是最后一个人,i=-1,下面index_person自加1变为0,从头开始下一轮报数
index_person=i+1; //index_person置于被淘汰人的后一个人
if(index_A==(M-1)) index_A=-1; //如果要淘汰的报数是最后一个,下一轮要淘汰的报数是第一个
index_A+=1; //index_A置于下一个要淘汰的报数
break; //淘汰一个人后退出for进入下一轮
}
if((N-1)==i) i=-1; //当报数到最后一个人时,仍没有匹配时,从第一个抽奖人继续报数
}
//输出淘汰操作后的情况,并计算剩余的人数
for(i=0;i<N;i++)
{
printf("%d ",person[i]);
if(person[i]!=0)
{
luckyOne=person[i];
personLeft++;
}
}
printf("\n");
}while(personLeft>1); //只有剩余的人数等于1时,才停止操作
printf("The lucky guy is:%d\n",luckyOne);
return 0;
}
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
[此贴子已经被作者于2016-2-27 09:49编辑过]