基于单循环链表的约瑟夫环问题。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”。