链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
输入描述:
输入一行包含三个整数n,k,m 1<=n<=100,1<=k<=n-1,1<=m<=100
输出描述:
输出一个整数
示例1
输入
复制5 1 2
5 1 2
输出
复制3
3
链表解法 与数组标记法
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
typedef struct node
{
int data;
node *next;
}Node,*Link;
int main()
{
int n = 0;
int k = 0;
int m = 0;
Link head;
Link q, p;//q,p两结点一前一后
head = (Link)malloc(sizeof(node));//头结点 记得free
head->data = -1;
head->next = NULL;//初始化养成好习惯
cin >> n >> k >> m;
//尾插法
Link tail = head;
int i = 0;
Link t1 = NULL;//准备拿第k-1个节点,
for (i = 0; i < n; i++)
{
//采用尾插法,用tail指针指向最后一个结点
p = (Link)malloc(sizeof(node));//开辟结点
p->data = i;//填写序号
tail->next = p;//插入尾部
p->next = head->next;//形成循环链表
if (i == k - 1)//记录第k个的上一个结点地址
{
t1 = p;
}
tail = p;//tail移动到最后一个节点
}
q = t1;//编号为k-1的节点
p = q->next;//编号为k的节点
i = 1;
while (p != q) // p,q点是一前一后,一旦他们相遇,说明只有一个节点
{
if (i == m)
{
//把p节点删去
q->next = q->next->next;
free(p);
//将p移动到下一个有效节点,i = 1 重新报数
p = q->next;
i = 1;
}
else
{
//p,q各往后移动
q = p;
p = p->next;
i++;
}
}
printf("%d", p->data);//剩下的唯一
free(p);
head->next = NULL;//初始化养成好习惯
free(head);
return 0;
}
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
int a[105];
int main()
{
int n = 0;
int k = 0;
int m = 0;
cin >> n >> k >> m;
int i = 0;
int sum = n-1;//一共要删去n-1个人,
int count = 1;
int pos = k;
while (sum)
{
if (a[pos] == 0)//未被标记的,才能数
{
if (count != m)//不是m
{
count++;//下一个报数
pos++;//下一个
pos %= n;
}
else//是m
{
a[pos] = 1;//
count = 1;
sum--;
pos++;
pos %= n;
}
}
else//被标记过的就移动
{
pos++;
pos %= n;
}
}
for (i = 0; i < n; i++)
{
if (a[i] == 0)
{
cout << i;
}
}
return 0;
}