zoukankan      html  css  js  c++  java
  • 初级算法

    很著名的一个问题。

    简单描述,n个人坐成一圈,然后按k的顺序将人剔除,直到剩下最后一个人。

    参考:约瑟夫问题

    我的思路就是将n个人标志为0,按k的顺序剔除的人改为标志1。 代码如下:

    #include <iostream>
    
    int main()
    {
        int total, n,i = 0,k=0,count = 0,count_ = 0;    
        std::cout << "输入总人数:";
        std::cin >> total;
        std::cout << "输入你想要循环的数:";
        std::cin >> n;
        int* nums = new int[total];
        memset(nums, 0, sizeof(int) * total);
    
        while(1)
        {
            for (i=0; i < total; i++)
            {
                if (!nums[i])
                {
                    count_++;
                }
                if (count_ > 1)
                {
                    count_ = 0;
                    break;
                }
            }
            if (count_ == 1)
            {
                break;
            }
            while (count != n)
            {
                if (!nums[k])
                {
                    count++;
                }
                ++k;
                if (k == total)
                {
                    k = 0;
                }
            }
            k -= 1;
            if (k < 0)
            {
                nums[total-1] = 1;
                k = 0;
            }
            else
            {
                nums[k] = 1;
            }        
            count = 0;        
        }
        
        for (i=0; i < total; i++)
        {
            if (!nums[i])
            {
                std::cout << "最后剩下的人标号:" << i << std::endl;
            }
        }
    
        delete nums;
        return 0;
    }

    标号是从数组下标0开始的,而不是从下标1开始的。

    代码可能看的不是很舒服,这也只是我暂时想到的。更多的方法可以自行百度。

    注意:使用memset初始化int数组为1时,会出现问题。所以我初始化为0了。

  • 相关阅读:
    安装selenium
    虚拟机安装Linux系统
    Pycharm安装+python安装+环境配置
    shell命令
    单例模式
    装饰者模式
    AtomicInteger的CAS原理
    J.U.C总览图
    锁机制(四)
    锁机制(三)
  • 原文地址:https://www.cnblogs.com/strive-sun/p/14426957.html
Copyright © 2011-2022 走看看