指尖在跳舞


私信TA

用户名:3058828054

访问量:820

签 名:

等  级
排  名 20827
经  验 649
参赛次数 0
文章发表 3
年  龄 0
在职情况 学生
学  校 中国矿业大学
专  业

  自我简介:

TA的其他文章

解题思路:把所有人弄成一个状态数组,出圈的状态设置为0,仍在圈中的状态唯一,先想办法搞到数组的长度,写了一个函数计算初始数组的长度,只能来计算状态数组的初始长度,再写一个求和函数,如果数组中最后的和等于1的话,那么这个1就是剩下的最后那个人,输出他的编号即可。

  1. 注意事项:计数为m的整数倍后把此数置为,表示出圈,同时计数变量也要置为,从而重新计数。遇到数字0也要跳过,并且不计数,循环到数组尾部后,要从1开始继续遍历数组,直到数组的和等于1为止。循环用的变量即为该人编号。(从i=1开始循环)

  2. 参考代码:

    

#include<iostream>

using namespace std;

int ArrLength(int *Arr) //计算状态数组初始长度

{

int i = 0;

while (Arr[i]!=0)

i++;

return i;

}

int sum(int a[],int n)//计算状态数组的和来反映是否淘汰完毕

{

    int sums=0;

    for(int i=1;i<=n;i++)

    {

        sums+=a[i];

    }

    return sums;

}

int main()

{

    int n,m;

    while(cin>>n>>m)

    {

    if(n==m&&m==0) break;

    int arr[n];

    int count=0;

    arr[0]=0;

    for(int i=1;i<=n;i++)

    {

        arr[i]=1;

    }

    while(sum(arr,n)>1)

    {

        

        for(int i=1;i<=n;i++)

        {

            if(arr[i]==0)//位置i上的人已经出圈 

            {

                continue;//跳过此位置的人             

            }

            count++;//此人还没有出圈,报数加一 

            if(count%m==0)//如果此人报到m了,将此位置的数字化为0并从下一个重新报数 

            {

                arr[i]=0;

                count=0;                

            }

            if(i==n)//此数字为最后一个数字就从零开始。 

    {

    i=0;

}

        }

        

}

    for(int i=1;i<=n;i++)

    {

        if(arr[i]==1)

        cout<<i<<endl;

    }

}

    


    return 0;

}


 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区