• 初级算法


    很著名的一个问题。

    简单描述,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了。

  • 相关阅读:
    留的住叫做幸福.流逝的叫做遗憾
    我爱你的各国语言
    英语单词 搞笑着背
    爱上你,是我的劫难(转)
    用人的四项基本原则
    希望不会再来 (转)
    8种没结果的爱(未婚者必读)!!!
    留住人才有办法
    英语口语集锦-劝告
    转帖]成功创业家的心理
  • 原文地址:https://www.cnblogs.com/strive-sun/p/14426957.html
Copyright © 2020-2023  润新知