赞
踩
问题描述:
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
解题思路:
该问题中有两个状态,上船与下船,因此需要对这两个状态分别进行标记,常用的即0与1,另需一个记数变量来结束循环,剩余15人为止。另需一变量来表示报数值,并当报数值为9的时候进行状态更改操作。
给30个人编号1-30,使用数组a[30]={0}表示,用于存储每个人的报数值;
使用数组b[30]={0}标记每个人的状态,即在船上还是船下,,这里将每个人的初值标记为0(表示在船上)1表示下船;
i代表他们的编号,当i等于31时,手动将i置为1;
c代表被扔下船的人数(c=15时循环结束);
变量j用来记数,j=9时将对应编号i的人置 0(扔下船)并让j重新记数。
- #include<stdio.h>
-
- int c = 0;//c代表被扔下船的人数
- int i = 1;
- int j = 0;
- int a[30] = { 0 };
- int b[30] = { 0 };
-
- int main()
- {
- while (i<=31)
- {
- if (i == 31)//当i等于31时,手动将i置为1
- {
- i = 1;
- }
- else if (c == 15)//c=15时跳出循环,循环结束
- {
- break;
- }
- else
- {
- if (b[i] != 0)//b[i]为1时,表示此人已下船,i加1,check不增加,继续循环
- {
- i++;
- continue;
- }
- else
- {
- j++;
- if (j != 9)
- {
- i++;
- continue;
- }
- else //j=9时将对应编号i的人标记为1,并记录其报数值9
- {
- b[i] = 1;
- a[i] = j;
- j = 0;
- printf("第%d号下船了\n", i);
- i++;
- c++;
- }
- }
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。