有n个人围成一圈,顺序排号。从第一个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人
(2013-11-26 10:34:27)分类: C |
谭浩强,C++ 第六章课后题第六个:
//剔除个数加1,判断是否满足循环条件
有n个人围成一圈,顺序排号。从第一个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人原来是第几号?
题意:n个人排成一圈,编号1~n,然后依次报数,报3的人推出,然后继续转圈循环报数,剩下两个时依旧循环
报数,直到剩下最后一个数,问最后这个数原来是排在1~n中的第几号?
思路:循环中有两组数,一组是原来的1~n的编号,另一组是1,2,3循环并剔除掉编号为3的数。还有一个循环
计数变量,决定循环在什么时候终止。
代码:
# include
<iostream>
using namespace
std;
int main()
{
int
c123,tuichu,i,*p,n;
int a[50];
cout<<"intput the num of the
person:";
cin>>n;
p = a;
//指针p获得a的首元素的地址(数组名a就是代表首元素的地址不需加&)
for
(i=0;i<n;i++)
//给每个人从1~n编号,第几个数就是几
*(p+i) = i+1;
tuichu=0;
//被剔除掉的个数
c123=0;
//1,2,3循环计数
i=0;
//判断i在1~n中的位置
while(tuichu
< n-1)
//最后肯定只剩下一个数
{
if(*(p+i) != 0)
c123++; //要提出的元素赋值为0,故可用元素值是不是0
来判断是不是已被剔除
if(c123 == 3)
//计数为3时,数组元素赋值为0;c123变为0,以便重新1-2-3计数;
{
*(p+i)=0;
c123=0;
tuichu++;
}
i++;
//判断i在1~n中的位置
if(i==n) i=0;
//如果i=n时,i需重置为0,以便在从1~n进行循环,但是此时c123并未置零,依旧满足规则
}
while (*p == 0) p++;
//剔除完之后,遍历数组找到那个非0的数输出
cout<<"The last num is:
"<<*p<<'\n';
return 0;
}
这课后题还是比较难的。
TIPS:
1.通过0,1状态来判断数字是否已被剔除。
2.1-2-3
循环往复,i=n时要重置零。
前一篇:C++中的引用