0
已解决
宋梓涵
新手光能
新手光能
#include<iostream>
using namespace std;
int a[101];
int last_one(int n,int m,int a[])
{
int s=0,i=0;
while(s<n)
{
int t=0;
while(1)
{
i++;
if(i>n)
i-=n;
if(a[i]==0)
t++;
if(t==m)
{
a[i]=1;
t=0;
s++;
cout<<i<<" ";
break;
}
}
}
return i;
}
int main()
{
int n,m;
cin>>n>>m;
cout<<last_one(n,m,a);
return 0;
}
0
已采纳
傅文彬
新手天翼
新手天翼
3999 报数游戏 1
这题比较复杂,我们可以采用如下这种思路解题:
- 首先定义一个数组a[100]表示一开始的人数,那么紧接着将数组中的每个元素标记为 1,表示一开始每个人都没有退出圈子;
- 函数实现退圈的过程:因为要求求出最后一个人的编号,我们可以定义一个s 表示一开始的游戏人数,那么当s==1 的时候,循环退出,所以循环可以使用while(s>1),然后每次数到 4 的人退出,所以我们可以定义一个sum 表示当前这次循环数到几了,如果没有到4, 执行sum+=a[i];(因为 a[i]没有出圈的时候为 1,出圈的时候为 0) 这样当sum=4 的时候,执行a[i]=0;sum=0;即可。
- 主函数中调用函数,但并未结束,最后需要找到数组中唯一的非
0 元素的编号,将它输出即可。
4000 报数游戏 2
本题和上题几乎一直,只需要改动一下sum 的条件即可。
0
李绍骞
修练者
修练者
核心代码:
定义函数
void Last_one(int n,int a[],int m)
{
int c=0,i=0,cnt;
while(c<n)
{
int t=0;
while(1)
{
i++;
if(i>n)
{
i-=n;
}
if(a[i]==0)
{
t++;
}
if(t==m)
{
c++;
a[i]+=c;
break;
}
}
}
}
主函数内,因为函数只是记录,所以......
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
0
0
何羽凡
修练者
修练者
0
宋梓涵
新手光能
新手光能
#include<iostream>
using namespace std;
int a[101];
int last_one(int n,int m,int a[])
{
int s=0,i=0;
while(s<n)
{
int t=0;
while(1)
{
i++;
if(i>n)
i-=n;
if(a[i]==0)
t++;
if(t==m)
{
a[i]=1;
s++;
t=1;
cout<<i<<" ";
break;
}
}
}
return i;
}
int main()
{
int n,m;
cin>>n>>m;
cout<<last_one(n,m,a);
return 0;
}
0