基于单循环链表的约瑟夫环问题

基于单循环链表的约瑟夫环问题。n个人围成一圈,从第一个人开始报数1、2、3, 凡报到3者退出圈子,
找出最后留在圈子中的人的序号。请实现下列解决约瑟夫环问题的单循环链表类Joseph,使程序正确运行。
当单向链表中的尾结点指向头结点即构成单循环链表。
如果输入为0,输出 No one!
不得修改源码,在指定位置填空。

#include
using namespace std;
struct  node
{
    int  data;
    node* next;
    node(int  d, node* n = NULL) :data(d), next(n) {}
};
class  Joseph
{
private:
    node* head;
public:
    Joseph(int  n);
    ~Joseph();
    void  simulate();
};
 /***********************


加入代码区域



**************************/
int  main()
{
    int  n;
    cin>> n;          //若输入5,表5人
    Joseph  jos(n);//生成有5个结点的链表,5个结点的data为1、2、3、4、5,表各人的序号
    jos.simulate();
    //输出两行。第一行输出被淘汰人的序号(序号间一个空格隔开):3  1  5  2
    //第二行输出剩下人的序号:4
 
    return  0;
}
 

参考本网页下面CSDN自动生成的相关推荐链接

以下是C++代码实现:

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

bool is24Multiple(int a, int b, int c, int d, string &expression)
{
    double result;
    // 一共3个运算符,有4个数,可以组成3^4 = 81种不同的运算方式
    for (int i = 0; i < 81; i++)
    {
        // 枚举4个数字的不同排列组合方式
        int A = a, B = b, C = c, D = d;
        int op1 = i / 27;
        int op2 = (i / 9) % 3;
        int op3 = (i / 3) % 3;
        int op4 = i % 3;

        string exp1, exp2, exp3;

        switch (op1)
        {
            case 0:
                result = A + B;
                exp1 = to_string(A) + "+" + to_string(B);
                break;
            case 1:
                result = A - B;
                exp1 = to_string(A) + "-" + to_string(B);
                break;
            case 2:
                result = A * B;
                exp1 = to_string(A) + "*" + to_string(B);
                break;
            case 3:
                if(B == 0)   // 防止除数为0
                    continue; 
                result = A * 1.0 / B; 
                exp1 = to_string(A) + "/" + to_string(B); 
                break;
        }

        switch (op2)
        {
            case 0:
                result += C;
                exp2 = "(" + exp1 + ")" + "+" + to_string(C);
                break;
            case 1:
                result -= C;
                exp2 = "(" + exp1 + ")" + "-" + to_string(C);
                break;
            case 2:
                result *= C;
                exp2 = "(" + exp1 + ")" + "*" + to_string(C);
                break;
            case 3:
                if(C == 0)   // 防止除数为0
                    continue; 
                result /= C; 
                exp2 = "(" + exp1 + ")" + "/" + to_string(C);  
                break;       
        }

        switch (op3)
        {
            case 0:
                result += D;
                exp3 = "(" + exp2 + ")" + "+" + to_string(D);
                break;
            case 1:
                result -= D;
                exp3 = "(" + exp2 + ")" + "-" + to_string(D);
                break;
            case 2:
                result *= D;
                exp3 = "(" + exp2 + ")" + "*" + to_string(D);
                break;
            case 3:
                 if(D == 0)   // 防止除数为0
                    continue; 
                result /= D;  
                exp3 = "("+exp2+")"+"/"+to_string(D);      
                break;    
        }

        // 如果计算结果是24的倍数,返回true
        if (fmod(result, 24) == 0){
            expression=exp3; 
            return true;}
    }
    return false;
}

int main()
{
    int a, b, c, d;
    cin >> a >> b >> c >> d;

    string expression="";
    if (is24Multiple(a, b, c, d,expression))
        cout << "true "<<"中缀表达式为:"<<expression << endl;
    else
        cout << "false" << endl;

    return 0;
}

在上述代码中,我们定义了一个is24Multiple()函数,它包括一个for循环,枚举了所有可能的四个数字排列组合和四则运算方式。我们使用switch语句来计算不同的运算方式,并且用fmod()函数判断计算结果是否为24的倍数,同时用字符串记录中缀表达式。最后,在主函数中调用该函数,如果返回true则输出“true”以及中缀表达式,否则输出“false”。