您的位置:首页 > 编程语言

经典趣味编程问题

2014-12-05 12:08 302 查看
相信很多人在笔试的时候会遇到类似的题目吧,问题是这样描述的:

有n个人围成一圈,顺序排号,从第一个人开始报数(从1~3报数),凡报到3的人退出圈子,

问最后留下的人原来排在第几号。

这个题目的思路其实不难,首先第一轮是需要被三整除,标记下报到3的那个人,然后在循环找下一个

报到3的个,记得找到的时候需要重新清下这个,从此人在往下找,依次找到,最后会留下那个没有被标记的数,就算找到了。

有点啰嗦,还是上代码吧

int FindLastNumber(int nums)
{
int i,isThree, total;
int array[nums];
int *pArray = array;

for(i=0; i<nums; i++)
{
*(pArray+i) = i+1;//顺序标号
}
i = 0;//循环变量
isThree = 0;//1,2,3计数变量
total = 0;//总数计数变量
while(total<nums-1)
{
if (*(pArray+i)!=0)
{
isThree++;//不为3,就继续往下找
}

if(isThree == 3)
{
printf("out number is:%d\n", *(pArray+i));
*(pArray+i) = 0;//标记下被点到的那个数
isThree = 0;//重新计数
total++;//计算下被标记的总数
}
i++;//往后移动
if(i==nums)
{
i = 0;//报到尾部后,需要重新计数
}
}
while(*pArray == 0)
{
pArray++;//将最后剩下的那一个数找出来
}
printf("the last number is:%d\n", *pArray);
return *pArray;
}
以上为这个题目的基本算法,找出来的是最后剩下的那个,在给出测试程序来验证下:

int main(int argc, char **argv)
{
int lastOne;
int nums;

while(1)
{
printf("Input the numbers of peoples:");
scanf("%d", &nums);

if(nums == 0)
{
printf("the wrong number!\n");
return 0;
}
lastOne = FindLastNumber(nums);
printf("out of queue number is:%d\n", lastOne);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: