1.求解最后一个
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
输入
2个数N和K,表示N个人,数到K出列。(2 <= N, K <= 10^6)
输出
最后剩下的人的编号
输入样例
3 2
输出样例
3
#include <bits/stdc++.h>
using namespace std;
//迭代写法
int Joseph(int n,int m)
{
/* if(n <= 1 || m <= 1)
return -1;*/
int ans = 0;
for(int i = 2; i <= n; i++)
{
ans = (ans + m) % i;
}
return ans+1;
}
int main()
{
int n,m;
cin>>n>>m;
cout<<Joseph(n,m)<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
//递归写法
int Joseph(int n,int m)
{
/*if(n <= 1 || m <= 1)
return -1;*/
if(n == 2)
{
if(m&1)
return 2;
else
return 1;
}
else
return (Joseph(n-1,m)-1 + m) % n + 1;
}
int main()
{
int n,m;
cin>>n>>m;
cout<<Joseph(n,m);
return 0;
}
2.求解每一个
题目背景
约瑟夫是一个无聊的人!!!
题目描述
n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.
输入格式
n m
输出格式
出圈的编号
输入输出样例
输入 #1 复制
10 3
输出 #1 复制
3 6 9 2 7 1 8 5 10 4
说明/提示
m,n≤100
//way4:vector模拟
#include <bits/stdc++.h>
using namespace std;
vector<int>v;
int main()
{
int n,m;
cin>>n>>m;
for(int i = 1; i <= n; i++)
v.push_back(i);
int x = 0;
for(int i = 0; i < n; i++)
{
x = (x + m - 1) % v.size();
cout<<v[x]<<" ";
v.erase(v.begin()+x);
}
return 0;
}
//way3:队列模拟
#include <bits/stdc++.h>
using namespace std;
int main()
{
queue<int>q;
int n,m;
cin>>n>>m;
if(!n||!m) return 0;
for(int i = 1; i <= n; i++)
{
q.push(i);
}
int cnt = 0;
while(q.size()>1)
{
int x = q.front();
cnt++;
q.pop();
if(cnt % m == 0){
cout<<x<<" ";
continue;
}
q.push(x);
}
cout<<q.front()<<endl;
q.pop();
return 0;
}
//way2:环形链表模拟
#include <bits/stdc++.h>
using namespace std;
typedef struct Node
{
int num;
struct Node *nxt;
}node;
node* createNode(int x)
{
node *p;
p = new node;
p->num = x;
p->nxt = NULL;
return p;
}
node* createJoseph(int n)
{
node *p,*head,*q;
for(int i = 1; i <= n; i++)
{
p = createNode(i);
if(i == 1)
head = p;
else
q->nxt = p;
q = p;
}
q->nxt = head;
return head;
}
void runJoseph(int n,int m)
{
node *p = createJoseph(n);
node *q = NULL;
while(p->nxt != p)
{
for(int i = 1; i < m-1; i++)
{
p = p->nxt;
}
q = p->nxt;
cout<<(q->num)<<" ";
p->nxt = q->nxt;
p = p->nxt;
delete q;
}
cout<<(p->num)<<endl;
}
int main()
{
int n,m;
cin>>n>>m;
if(n&&m)
runJoseph(n,m);
return 0;
}
//way1:数组模拟
#include <iostream>
using namespace std;
bool vis[105];
int main()
{
int n,m;
cin>>n>>m;
int cnt = 0,num = 0;
while(cnt<n)
{
for(int i = 1; i <= n; i++)
{
if(vis[i]) continue;
num++;
if(num % m == 0)
{
vis[i] = true;
if(cnt != n)cout<<i<<" ";
else cout<<i<<endl;
cnt++;
if(cnt == n) break;
}
}
}
return 0;
}
//数组模拟链表
#include <bits/stdc++.h>
using namespace std;
int nxt[105];
int main()
{
int n,m;
cin>>n>>m;
for(int i = 1; i <= n; i++)
nxt[i] = i+1;
nxt[n] = 1;
for(int i = n,j = 1; n;i = nxt[i],j++)
{
if(j % m == 0)
{
cout<<nxt[i]<<" ";
nxt[i] = nxt[nxt[i]];
n--;
}
}
return 0;
}