最近开始C语言的战略性回顾,看到这样一道题目,其实挺简单的。
撸完算法,竟然发现参考答案比手撸的代码复杂且繁琐,于是就有了这篇博客。
如下:
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
分析 :假设这30个人都有编号,编号可从0开始可从1开始,从0开始就对应数组下标。依次从1报数(i++)报到9(i=9)的人下船后面继续从1报数。已下船的人不能报数。
算法如下:
#include <stdio.h>
main(){
int a[30]={0};
int j=0; //数组下标,人员编号
int i=0; //人员报数
int c=1; //统计已下船人数
while(c<=15)
{
if(j==30)
j=0; //超过人员总数时,置为0,从队尾回到队头
if(a[j]==0) //数组值为0时,报数有效
i++;
if(i==9)
{
a[j]=1; //下船人数组置为 1
i=0; //有下船后,重新报数
printf("第%d下船\n",j+1);
c++; //下船人数+1
}
j++; //数组下标循环
}
}