C语言程序设计教程(第三版)课后习题10.5(C++) kkmd66

本文探讨了如何通过改进约瑟夫环的解法解决多人报数淘汰问题,对比了两种代码实现,第一种因时间超时,而第二种方法高效通过。重点在于提升算法效率,以应对大规模数据输入。

难点


1、按照流程进行解算,可以得出正确答案,但是时间超时,第一段代码; 2、用约瑟夫环的解法解算,可以通过,第二段代码;


Description:

有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

Input:

包含多组数据。

每行表示初始人数n。

最后一组是0,不用处理。

Output:

对每个测试数据输出最后一人的初始编号

Sample Input:

3
7
0

Sample Output:

2
4

#include <iostream>
#include "string"

using namespace std;

/**
 * kkmd66
 * @return
 */

int main() {

    int n;
    while (cin >> n && n != 0) {

        //输入数据
        string str;
        for (int i = 1; i <= n; ++i) {
            string c = to_string(i);
            str += c;
        }

        //依次踢出
        int pos = 0;
        while (str.size() > 1) {
            for (int i = 0; i < 2; ++i) {
                if (pos > str.size() - 1)
                    pos = 0;
                else
                    pos++;
                if (pos > str.size() - 1)
                    pos = 0;
            }
            if (pos > str.size() - 1)
                pos = 0;

            str.erase(pos, 1);

            if (pos > str.size() - 1)
                pos = 0;

        }

        //输出
        cout << str[0] << endl;

    }
    return 0;
}

#include <iostream>

using namespace std;

/**
 * kkmd66
 * 约瑟夫环
 * @return
 */

int main() {
    int n;
    while (cin >> n && n != 0) {
        
        int result = 0;
        
        //约瑟夫环
        for (int i = 2; i <= n; i++) {
            result = (result + 3) % i;
        }
        cout << result + 1 << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值