加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2013-11-26 10:34:27)
分类: C
谭浩强,C++ 第六章课后题第六个:
有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计数;
                     //剔除个数加1,判断是否满足循环条件
{
*(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时要重置零。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有