求解

ASecurity 2011-09-08 08:03:49
一道C语言编程题。。。想了两天也不知怎么解。题目是:有25个人围成一圈,从第一个人开始顺序报号,凡报到3或3的倍数者推出,知道剩下最后一个人,然后输出此人第一次所报的数字;


我的想法是先创建25个节点将他们链接起来,然后逐个检查节点中的数值,能被三整除的,再free掉,但是不知道如何解决下一轮计数,也就是说,假设1号报1,第一轮结束后它应该报26,而2号报27,4号报28.。。。。。
...全文
75 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnYidan 2011-09-08
  • 打赏
  • 举报
回复
google 约瑟夫环
nanioooo 2011-09-08
  • 打赏
  • 举报
回复
个人认为没有这个必要,想想吧:1到10内,3的倍数有3个,由此类推,每加三就可以被三除,对吧,那没每三十个数可惜消去10个数,因此25个数需要加到70,则还剩下两个数,71和72,显然72删除,71留下。
尘缘udbwcso 2011-09-08
  • 打赏
  • 举报
回复
数组person[i]==1表示第i+1个人在圈内
person[i]==0表示第i+1个人不在圈内
尘缘udbwcso 2011-09-08
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <malloc.h>
int main()
{
int count, *person, num;
int tmp = 0;
int i, killed = 0;
printf("总人数:");
scanf("%d", &count);
person = (int*)malloc(sizeof(int));
for(i = 0; i < count; ++i)
*(person+i) = 1;
printf("每次数多少人:");
scanf("%d", &num);
i = 0;
while(killed != count)
{
if(i == count)
i = 0;
tmp += *(person+i);
if(tmp == num)
{
*(person+i) = 0;
++killed;
printf("%d is killed\n", i+1);
tmp = 0;
}
++i;
}
return 0;
}

这个可以任意输入人数和数的数字
比如输入25 3 表示有25个人围成一圈,数数,数到3或3的倍数就出去
尘缘udbwcso 2011-09-08
  • 打赏
  • 举报
回复

#include <stdio.h>
int main()
{
int person[25];
int i = 0, count = 0, out = 0;
for(i = 0; i < 25; ++i)
person[i] = 1;
i = 0;
while(count != 24)
{
out += person[i];
if(out == 3)
{
person[i] = 0;
out = 0;
++count;
printf("%d out\n", i+1);
}
++i;
if(i == 25)
i = 0;
}
for(i = 0; i < 25; ++i)
if(person[i] == 1)
break;
printf("剩下%d,他第一次报的数是%d\n", i+1, i+1);
return 0;
}

猫xiaowai 2011-09-08
  • 打赏
  • 举报
回复
环形链表
relaxisland 2011-09-08
  • 打赏
  • 举报
回复
把首尾连接成环就能解决你的问题吧。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧