题目描述
设有 nn 个人围坐在圆桌周围,现从某个位置 kk 上的人开始报数,报数到 mm 的人就站出来。下一个人,即原来的第 m+1m+1 个位置上的人,又从 11 开始报数,再报数到 mm 的人站出来。依次重复下去,直到全部的人都站出来为止。试设计一个程序求出这 nn 个人的出列顺序。
ss
要求一:采用循环链表解决。
要求二:可以使用模拟法,模拟循环链表。
要求三:可以不使用循环链表类的定义使用方式。
输入描述
输入只有一行且为用空格隔开的三个正整数 n,k,mn,k,m,其含义如上所述。
输出描述
共 nn 行,表示这 nn 个人的出列顺序。
输入输出样例
示例 1
输入
3 5 8
copy
输出
3
2
1
copy
运行限制
最大运行时间:1s
最大运行内存: 128M
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct Node
{
int data;
Node *next;
};
/*int x[15]= {0,1,2,3,4,5,6,7,8,9,10,0,0,0,0};
int find(int key)
{
int ans;
for(int i=1; i<=10; i++)
{
if(x[i]==key)
{
ans=i;
break;
}
}
return ans;
}
void yidong(int w)
{
int temp=x[w];
for(int i=w; i>=2; i--)
{
x[i]=x[i-1];
}
x[1]=temp;
}
*/
/*
Node *head=new Node;
void insertt(int n)
{
Node *temp=new Node;
temp->data=n;
temp->next=head->next;
head->next=temp;
}
void deletee(int key)
{
Node *before=head;
for(Node *t=head->next; t!=0; t=t->next)
{
if(t->data==key)
{
Node *temp=t;
before->next=t->next;
delete temp;
return;
}
before=t;
}
}
void printff()
{
for(Node *i=head->next; i!=0; i=i->next)
{
printf("%d ",i->data);
}
printf("\n");
}*/
int main()
{
int n,k,m;
scanf("%d %d %d",&n,&k,&m);
int start;
if(n>k) start=k;
else
{
if(k%n==0)
{
start=n;
}
else start = k%n;
}
Node *head=new Node;
Node *p=new Node;
head->data=1;
head->next=0;
p=head;
for(int i=2; i<=n; i++)
{
Node *temp=new Node;
temp->data=i;
temp->next=0;
p->next=temp;
p=temp;
}
p->next=head;
p=head;
Node *yes=new Node;
for(Node *t=p->next;t!=0;t=t->next)
{
if(t->data==start)
{
yes=t;
break;
}
}
p=yes;
Node *r=new Node;
while(p->next!=p)
{
for(int i=1; i<m; i++)
{
r=p;
p=p->next;
}
printf("%d\n",p->data);
r->next=p->next;
p=p->next;
}
printf("%d",p->data);
return 0;
}
快忘干净了,好好准备下,一个晚上被nullptr搞了心态,空指针之前都是正常用的,今晚总是说没有在范围内定义,现在也没有解决,求大佬抬一手,指针感觉理解的差不多了。