| 查看: 570 | 回复: 0 | ||
ju5200木虫 (正式写手)
|
[求助]
C++实现24点计算的代码哪位大哥能帮忙解释一下啊?课程设计,快急死了,万分感谢啊!
|
|
#include<iostream> using namespace std; #include<string> #include<stdlib.h> const double PRECISION = 1E-6; //精度常量 const int COUNT_OF_NUMBER = 4; //算24点的自然数个数 const int NUMBER_TO_BE_CAL = 24; void Swap(int &m,int &n) { int x; x=m; m=n; n=x; } class RationalNumber //定义有理数类(分子、分母) { protected: int numerator,denominator; //numerator:分子,denominator:分母 bool inf; protected: int gcd(int a,int b) //求a和b的最大公约数 { if(a==0)return b;if(b==0) return a; if(a>b) Swap(a,b); while(a>0){ int c=b%a;b=a;a=c; } return b; } public: RationalNumber() { inf=false; } RationalNumber(int n) { numerator=n; denominator=1; inf=false; } RationalNumber(int numerator,int denominator) { this->numerator=numerator; this->denominator=denominator; Simplify(); } virtual ~RationalNumber() {} void Simplify() { if(denominator==0) { inf=true; } else if(numerator==0) { denominator=1; inf=false; } else { int k=gcd(abs(numerator),abs(denominator)); numerator/=k; denominator/=k; inf=false; } } RationalNumber operator+(const RationalNumber& b) const { RationalNumber result; result.denominator=this->denominator*b.denominator; result.numerator=this->numerator*b.denominator+this->denominator*b.numerator; result.Simplify(); return result; } RationalNumber operator-(const RationalNumber& b) const { RationalNumber result; result.denominator=this->denominator*b.denominator; result.numerator=this->numerator*b.denominator-this->denominator*b.numerator; result.Simplify(); return result; } RationalNumber operator*(const RationalNumber& b) const { RationalNumber result; result.denominator=this->denominator*b.denominator; result.numerator=this->numerator*b.numerator; result.Simplify(); return result; } RationalNumber operator/(const RationalNumber& b) const { RationalNumber result; result.denominator=this->denominator*b.numerator; result.numerator=this->numerator*b.denominator; result.Simplify(); return result; } RationalNumber& operator=(const RationalNumber& b) { denominator=b.denominator; numerator=b.numerator; return (*this); } RationalNumber& operator=(int b) { denominator=1; numerator=b; return (*this); } bool operator==(const RationalNumber& b) const { if((b.denominator==this->denominator)&&(b.numerator==this->numerator)) return true; return false; } bool operator==(int b) const { if((1==this->denominator)&&(b==this->numerator)) return true; return false; } bool operator!=(const RationalNumber& b) const { if(b.denominator!=this->denominator||b.numerator!=this->numerator) return true; return false; } bool operator!=(int b) const { if(1!=this->denominator||b!=this->numerator) return true; return false; } int Numerator() const { return numerator; } int Denominator() const { return denominator; } }; RationalNumber number[COUNT_OF_NUMBER]; //用数组number[]保存操作数 string expression[COUNT_OF_NUMBER]; //用数组expression[]保存算式 bool Search(int n) //递归函数 { if (n==1) { if (number[0]==NUMBER_TO_BE_CAL) //成功搜索得到24 //若number[]是double型 //也可用if (fabs(number[0]-NUMBER_TO_BE_CAL)<PRECISION) { cout<<expression[0]<<endl; //输出表达式 return true; } else { return false; } } for (int i=0;i<n;i++) { for (int j=i+1;j<n;j++) { RationalNumber a, b; string expa, expb; a=number; //用a保存number b=number[j]; //用b保存number[j] number[j]=number[n-1]; //将number[n-1]向前填入到原来number[j]的位置 expa=expression; //用expa保存expression expb=expression[j]; //用expb保存expression[j] expression[j]=expression[n-1]; //将expression[n-1]向前填入到原来expression[j]的位置 //因为下一层递归调用search(n-1)将仅对下标为0~n-2的数进行操作了 //加法 expression='('+expa+'+'+expb+')'; //将a和b计算的算式填入到原来expression的位置 number=a+b; //将a和b计算的结果填入到原来number的位置 if (Search(n-1)) return true; //一旦得到一个可行解,即层层向上返回,从而确保只输出一个可行解 //减法有两种情况a-b和b-a expression='('+expa+'-'+expb+')'; number=a-b; if (Search(n-1)) return true; expression='('+expb+'-'+expa+')'; number=b-a; if (Search(n-1)) return true; //乘法 expression='('+expa+'*'+expb+')'; number=a*b; if (Search(n-1)) return true; //除法也有两种情况a/b和b/a if (b!=0) { expression='('+expa+'/'+expb+')'; number=a/b; if (Search(n-1)) return true; } if (a!=0) { expression='('+expb+'/'+expa+')'; number=b/a; if (Search(n-1)) return true; } //本轮调用完毕后,用a,b,expa,expb将数组number[]和expression[]恢复原状 number=a; number[j]=b; expression=expa; expression[j]=expb; } } return false; } 小弟的C++都是自学的 里面好多东西之前没接触过 因为课程设计时间比较紧 没时间查看相关资料 特来此求出 代码文件在附件里 稍微有点长 还请各位帮帮忙了 先谢谢各位了 int main() { cout<<"please input four numbers:"<<endl; for (int i=0;i<COUNT_OF_NUMBER;i++) { char buffer[20]; //分配长度为20的字符数组buffer[] int x; cin>>x; number=x; itoa(x,buffer,10); //itoa():将一个10进制的integer数转换为string类型 //即:把输入的int型操作数x,转变成可以放在buffer[]中的string类型 expression=buffer; //用expression指针指向buffer[]数组空间的起始位置 } bool dex=Search(4); if(!dex) cout<<"Fail!!!"<<endl; return 0; } |
» 猜你喜欢
三无产品还有机会吗
已经有6人回复
垃圾破二本职称评审标准
已经有7人回复
投稿返修后收到这样的回复,还有希望吗
已经有7人回复
博士申请都是内定的吗?
已经有14人回复
谈谈两天一夜的“延安行”
已经有13人回复
氨基封端PDMS和HDI反应快速固化
已经有11人回复
之前让一硕士生水了7个发明专利,现在这7个获批发明专利的维护费可从哪儿支出哈?
已经有11人回复
论文投稿求助
已经有4人回复
Applied Surface Science 这个期刊。有哪位虫友投过的能把word模板发给我参考一下嘛
已经有3人回复













回复此楼