一道c语言问题,直接不会啊,帮忙写一串代码,好吗
题目描述有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。输入包含多组数据。每行表示初始人数n。(0<...
题目描述
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
包含多组数据。
每行表示初始人数n。(0<n<1000000)
最后一样是0,不用处理。
输出
对每个测试数据输出最后一人的初始编号
样例输入
3
7
0
样例输出
2
4 展开
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
包含多组数据。
每行表示初始人数n。(0<n<1000000)
最后一样是0,不用处理。
输出
对每个测试数据输出最后一人的初始编号
样例输入
3
7
0
样例输出
2
4 展开
1个回答
展开全部
#include<stdio.h>
struct node
{
int data;//数据域
node *next; //指针域
};
int main()
{
int n,m=3,i;
while(scanf("%d",&n)&&n!=0)
{
node *L=NULL,*s,*tail,*pre;
for(i=1;i<=n;i++) //建立循环链表
{
s = new node;
s->data = i;
if(i == 1) L=s;
else tail->next = s;
tail = s;
}
tail->next = L;
int count=1;
s = L; //s指向当前正数到的人
pre = tail;
while(s->next!=s) //多于一个结点时
{
while(count<m)
{
count++;
pre = s ;
s = s->next;
}
//数到第m个时,删除一个结点(即杀死一人)
pre->next = s->next;
delete s;
s = pre->next;
count=1;
}
printf("%d\n",s->data) ;
//cout<<s->data<<endl;
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询