输入两个正整数 n 和 m( (1<m<n<=50)),有 n 个人围成一圈,按顺序从 1 到 n 编号。从第一个人开始报数,报数 m 的人退出圈子,下一个人从 1 开始重新报数,报数 m 的人退出圈子。如此循环,直到留下最后一个人。请按退出顺序输出退出圈子的人的编号,以及最后一个人的编号。
提示:将每个人的编号存入数组,从第一个人开始报数,输出报数 m 的人的编号,并将该编号清除为0,重复这样的操作直至只剩下一个不为0的数,该数就是最后一个人的编号。
输入输出示例:括号内为说明,无需输入输出
输入样例:
5 (n个人报数,n=5)
3 (报数m=3)
输出样例:
No1: 3 (第1个退出圈子的人编号是3)
No2: 1 (第2个退出圈子的人编号是1)
No3: 5 (第3个退出圈子的人编号是5)
No4: 2 (第4个退出圈子的人编号是2)
Last No is: 4 (最后一个人的编号是4)
(数组+循环实现):
#include<iostream>
using namespace std;
int main()
{
int n,m,i,j,k=0,t,num[60],p=1;
cin>>n>>m;
for(i=1;i<=n;i++)
num[i]=i;
t=n;
while(n!=1)
{
for(j=1;j<=t;j++)
{
if(num[j]!=0) k++;
if(k==m){
cout<<"No"<<p<<": "<<j<<endl;
p++;
num[j]=0;
k=0;
n--;
}
}
}
for(i=1;i<=t;i++)
if(num[i]!=0)
cout<<"Last No is: "<<i;
return 0;
}
出色的物理引擎(同类型的题目)
卡罗拉最近沉迷于ark游戏,游戏中的地图上有n个浮空的石头围成了一圈,在优秀的物理引擎支持下,这些石头会自动落下。她发现石头落下的顺序是有规律的。一共有n个石头,从第一块石头开始数,数到第m个石头,那块就是第一个落下的石头;之后从第一个落下的石头后一个重新从1开始数,同样数到第m个石头,那个就是第二个落下的石头;以此类推。为了方便,对这些石头从1开始编号。卡罗拉现在想知道最后落下的是那一块石头?
输入格式:
输入包含两个整数n和m (1<=m,n<=1000)。
输出格式:
输出一 个整数,代表最后落下的石头的编号。
输入样例:
10 3
输出样例:
4
用链表实现
#include<iostream>
using namespace std;
typedef struct p{
int num;
struct p *next;
}ss;
int m,n;
void creat()
{
int i;
ss* p1,*p2;
ss *a,*b,*head=NULL;
b=new ss;
for(i=0;i<n;i++){
a=new ss;
a->num=i+1;
if(i==0){
head=a;
a->next=head;
}
else{
a->next=head;
b->next=a;
}
b=a;
}
p2=b;
int count=n;
while(count!=1)
{
for(i=0;i<m;i++)
{
if(i==m-1)
{
p2->next=p1->next;
count--;
}
else {
p2=p2->next;
p1=p2->next;
}
}
}
cout<<p2->num;
}
int main(){
cin>>n>>m;
creat();
return 0;
}