一道课程作业引发的思考
STL最短
//数据量不大直接暴力模拟
#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int n,m;
int main() {
cin >> n >> m;//总人数,间隔数
for (int i = 0; i < n; i++) a.push_back(i);
unsigned int i = m - 1;
a.erase(i + a.begin());
while (a.size() > m - 1) {
i = (i + m - 1) % a.size();
a.erase(i + a.begin());
}
for(auto x : a)
cout << x + 1 << ' ';
}
算法初学者可能会这么做
//还可以用数组下标代替指针
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int idx, head, n[N], ne[N],p,m;
void remove(int k) {
if (ne[k] == ne[head]) {
ne[head] = ne[ne[head]];
}
ne[k] = ne[ne[k]];
}
void add_head(int x) {
n[idx] = x;
ne[idx] = head;
head = idx++;
}
void add(int k, int x) {
n[idx] = x;
ne[idx] = ne[k];
ne[k] = idx++;
}
int main() {
head = -1, idx = 0;
cin >> p >> m;
int size = p;
add_head(0);
for (int i = 1; i <= p; i++)add(i - 1, i);
ne[idx-1] = ne[head];
int i=ne[head];
for (int j = 0; j < m-2; j++) {
i = ne[i];
}
remove(i);
while (--size >= m) {
for (int j = 0; j < m-1; j++) {
i = ne[i];
}
remove(i);
}
int j = 1;
i = ne[head];
while (j < m) {
cout << n[i] << ' ';
i = ne[i];
j++;
}
}
刚开始学数据结构,请见谅
//传统做法
#include<bits/stdc++.h>
using namespace std;
int n, m;
typedef struct LNode {
int data;
struct LNode* next;
}LinkNode;
void CreateListR(LinkNode*& L) {
LinkNode* s, * r;
int i;
L = (LinkNode*)malloc(sizeof(LinkNode));
r = L;
for (i = 1; i <= n; i++) {
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = i;
r->next = s;
r = s;
}
r->next = L->next;
}
void DispList(LinkNode* L) {
LinkNode* p = L->next;
int j = 0;
while (j<m-1) {
printf("%d ", p->data);
p=p->next;
j++;
}
cout << endl;
}
void DelList(LinkNode*& L) {
int j = 0,size=n;
LinkNode* p = L, * q;
while (size-- >= m) {
j = 0;
while (j < m - 1) {
p = p->next;
j++;
}
q=p->next;
if (q == L->next)L->next = L->next->next;
//printf("%d\n", q->data);
p->next = q->next;
free(q);
//DispList(L);
}
}
int main() {
scanf("%d%d", &n, &m);
LinkNode* L;
CreateListR(L);
DelList(L);
DispList(L);
}
其实是因为省赛寄了横竖睡不着觉才这么无聊