发信人: goldeagle()
整理人: yangcs(2000-03-09 14:46:06), 站内信件
|
我真是粗心,Test()中的错误改得不彻底,而且分数类中对除以0的错误 处理得不对,今天修改后一起再贴出来,应该不会错了。 大家帮忙看看,多谢了!
//CALC24.CPP //计算24程序 goldeagle 2000-03-08
#include <stdlib.h> #include <iostream.h> #include "fraction.hpp"
struct CalcTest { int no[4]; // 数字 int op[3]; // 运算符 + - * / int nx[3]; // 运算次序 };
int norder[24][4], noi=0;
fraction CalcOne(fraction f1, fraction f2, int o) { fraction s; switch (o) { case 0: s=f1+f2; break; case 1: s=f1-f2; break; case 2: s=f1*f2; break; case 3: s=f1/f2; } return s; }
void PrintOut(CalcTest t) { // 输出表达式 static char cop[]="+-*/"; int i, j, brackets[2][3]={{0,0,0},{0,0,0}};
brackets[0][t.nx[0]-1]++; brackets[1][t.nx[0]-1]++; if (abs(t.nx[1]-t.nx[0])>1) { brackets[0][t.nx[1]-1]++; brackets[1][t.nx[1]-1]++; } else { if (t.nx[1]>t.nx[0]) { brackets[0][t.nx[0]-1]++; brackets[1][t.nx[1]-1]++; } else { brackets[0][t.nx[1]-1]++; brackets[1][t.nx[0]-1]++; } } for (i=0;i<4;i++) { if (i<3) for (j=0;j<brackets[0][i];j++) cout<<'('; cout<<t.no[i]; if (i>0) for (j=0;j<brackets[1][i-1];j++) cout<<')'; if (i<3) cout<<cop[t.op[i]]; } cout<<endl; }
void Test(CalcTest t) { // 检查算式结果是否24 fraction n[4]; int i, j, p[4], p1; for (i=0;i<4;i++) { n[i]=fraction(t.no[i], 1); p[i]=i; } for (i=0;i<3;i++) { n[p[t.nx[i]]]=CalcOne(n[p[t.nx[i]-1]], n[p[t.nx[i]]], t.op[t.nx[i]-1]); p1=p[t.nx[i]-1]; for (j=0;j<4;j++) if (p[j]==p1) p[j]=p[t.nx[i]]; } if ((n[p[t.nx[2]]].getnumerator()==24) && (n[p[t.nx[2]]].getdenominator()==1)) PrintOut(t); return; }
void permutation(int a[], int m) { // 排列算法 int i, t; if (m<3) { permutation(a, m+1); for (i=m+1;i<4;i++) { t=a[m]; a[m]=a[i]; a[i]=t; permutation(a, m+1); t=a[m]; a[m]=a[i]; a[i]=t; } } else { for (i=0;i<4;i++) norder[noi][i]=a[i]; noi++; } }
void calc24(int a[]) { CalcTest t; int i, j, k, n, ok; for (i=0;i<24;i++) { // 24种排列 //去除因给定4数中有相同而产生的排列重复情况 ok=1; for (j=0;(j<3)&&ok;j++) for (k=j+1;(k<4)&&ok;k++) if ((a[norder[i][j]]==a[norder[i][k]]) && (norder[i][j]>norder[i][k])) ok=0; if (!ok) continue; for (j=0;j<4;j++) t.no[j]=a[norder[i][j]]; for (j=0;j<64;j++) { // 64种运算符排列 n=j; for (k=0;k<3;k++) { t.op[k]=n%4; n/=4; } for (k=0;k<6;k++) { // 6种运算次序 for (n=0;n<3;n++) t.nx[n]=norder[k][n+1]; if (!((t.nx[0]==3) && (t.nx[1]==1))) //除去312次序 Test(t); } } } }
int main() { int a[]={0,1,2,3}; permutation(a, 0); cout<<"Please input 4 numbers:"; cin>>a[0]>>a[1]>>a[2]>>a[3]; calc24(a); return 0; }
//FRACTION.HPP //分数类 goldeagle 2000-03-08
class fraction { private: int numerator, denominator; void reduction(void); public: fraction(void); fraction(int, int); void setnumerator(int); void setdenominator(int); int getnumerator(void); int getdenominator(void); int iserror(void); fraction operator +(fraction a); fraction operator -(fraction a); fraction operator *(fraction a); fraction operator /(fraction a); fraction operator -(); };
//FRACTION.CPP //分数类 goldeagle 2000-03-08
#include <math.h> #include <iostream.h> #include "fraction.hpp"
int maxcommondivisor(int a, int b) { a=abs(a); b=abs(b); while (a!=b) if (a<b) b-=a; else a-=b; return a; }
int mincommonmultiple(int a, int b) { return a/maxcommondivisor(a,b)*b; }
void fraction::reduction(void) { int n; if (iserror()) return; if (numerator==0) { numerator=0; denominator=1; } else { numerator=abs(numerator)*(numerator<0?-1:1)* (denominator<0?-1:1); denominator=abs(denominator); n=maxcommondivisor(numerator, denominator); numerator/=n; denominator/=n; } }
fraction::fraction(void) { numerator=0; denominator=1; }
fraction::fraction(int n, int d) { numerator=n; denominator=d; reduction(); }
int fraction::iserror() { return (denominator==0); }
void fraction::setnumerator(int n) { numerator=n; reduction(); }
void fraction::setdenominator(int d) { denominator=d; reduction(); }
int fraction::getnumerator(void) { return numerator; }
int fraction::getdenominator(void) { return denominator; }
fraction fraction::operator +(fraction a) { fraction c; int m, da, db;
if (iserror()||a.iserror()) return fraction(0,0); m=mincommonmultiple(a.denominator, denominator); da=m/a.denominator; db=m/denominator; c.numerator=a.numerator*da+numerator*db; c.denominator=m; c.reduction(); return c; }
fraction fraction::operator -() { fraction a(-numerator, denominator); return a; }
fraction fraction::operator -(fraction a) { return *this+(-a); }
fraction fraction::operator *(fraction a) { fraction c; if (iserror()||a.iserror()) return fraction(0,0); c.numerator=a.numerator*numerator; c.denominator=a.denominator*denominator; c.reduction(); return c; }
fraction fraction::operator /(fraction a) { fraction c; if (iserror()||a.iserror()) return fraction(0,0); c.numerator=numerator*a.denominator; c.denominator=denominator*a.numerator; c.reduction(); return c; }
-- 行侠仗义吾本性,展翅翱翔天地间 请加入我创建的邮件列表“金鹰的程序员天地”: (发一封空邮件到 [email protected], 再回复一封确认信就可以了)
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.182.36]
|
|