From kiyoto-s@mail1.big.or.jp Wed May 12 18:01:51 1999 Received: from wise13.mn.waseda.ac.jp (wise13.mn.waseda.ac.jp [133.9.4.145]) by newton.kashi.info.waseda.ac.jp (8.8.8/3.7W) with ESMTP id SAA00284 for ; Wed, 12 May 1999 18:01:44 +0900 (JST) Received: from wise20.mn.waseda.ac.jp (wise20.mn.waseda.ac.jp [133.9.4.141]) by wise13.mn.waseda.ac.jp (8.9.1a/3.7W-19980811) with ESMTP id RAA26889 for ; Wed, 12 May 1999 17:50:48 +0900 (JST) Received: from wise19.mn.waseda.ac.jp (wise19.mn.waseda.ac.jp [133.9.4.137]) by wise20.mn.waseda.ac.jp (8.9.1+3.0W/3.7W-19981111) with ESMTP id RAA17238 for ; Wed, 12 May 1999 17:50:48 +0900 (JST) Received: from mail1.big.or.jp (root@mail1.big.or.jp [210.155.152.31]) by wise19.mn.waseda.ac.jp (8.9.1a/3.7W-19980811) with ESMTP id RAA11345 for ; Wed, 12 May 1999 17:50:48 +0900 (JST) Received: from -------l (pppr04-136.big.or.jp [210.155.156.136]) by mail1.big.or.jp (8.9.1/3.7W98122217) with SMTP id RAA01248; Wed, 12 May 1999 17:50:40 +0900 Message-ID: <001101be9c54$c6aa7b80$889c9bd2@-------l> From: "k.satoh" To: Cc: Subject: JSJ2 Date: Wed, 12 May 1999 17:52:31 +0900 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_000D_01BE9CA0.3543F8A0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 4.72.3110.5 X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3 Status: OR This is a multi-part message in MIME format. ------=_NextPart_000_000D_01BE9CA0.3543F8A0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit // C++ Source Files //-------------------------- // 任意の4桁の自然数の各桁の // 数字を1回ずつ使いその式の // 値が10になるものを求める // Ticket.cpp //-------------------------- #include #include #include #include #include #define N_DIGIT 4 using namespace std; // CExpresionクラス // 文字列式をメンバとしそれを // 逆ボーランド記法 -> 後置式を評価 //-------------------------------------------------------- class CExpresion{ friend ostream &operator<<(ostream &,CExpresion *); public: CExpresion(string &exp); // コンストラクタ bool operator==(int); // 演算子関数 private: string ConvertToPostfix(); // 後置式変換プロシージャ int Eval(string &); // 後置式評価プロシージャ bool isPriority(char,char) const; // 第一引数の演算子は第二引数の演算子 // より優先順位が大きいか string expresion; // 式を表すstringオブジェクト }; //-------------------------------------------------------- // CExpresionクラス実装 //-------------------------------------------------------- // ostreamオブジェクトにexpを挿入 ostream &operator<<(ostream &out,CExpresion *exp){ out<expresion; return out; } // コンストラクタ CExpresion::CExpresion(string &exp){ expresion=exp; } // 演算子関数 10と等しいか bool CExpresion::operator==(int num){ return (Eval(ConvertToPostfix())==num?true:false); } // expresionメンバを逆ボーランド記法(後値式)に変換 string CExpresion::ConvertToPostfix(){ //************ 後値式変換アルゴリズム ************************** // 1. 中値式の最後に右括弧')'を挿入 // 2. スタックに左括弧を挿入 // 3. 中値式を1文字ずつ評価し、その文字が数字ならそのまま出力 // 4. 演算子ならその演算子より優先順位が高い間スタックからポップする // 5. 左括弧ならスタックにプッシュする // 6. 右括弧ならスタックの先頭が左括弧になるまでスタックから // ポップし、スタックの先頭をポップする //******************************************************************* string infix,postfix; // 中値式及び後値式 infix=expresion+")"; // 中値式のラスに右括弧を挿入 stack register_stack; // 演算子、括弧を格納するスタック register_stack.push('('); string tmp; // 一時文字列変数 int infix_index=0; while(!register_stack.empty()){ // 数値である char ch=infix[infix_index]; infix_index++; switch(ch){ // 数字である case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': tmp=ch; postfix+=tmp; break; // 演算子である case '+': case '-': case '*': case '/': char op; op=register_stack.top(); while(isPriority(op,ch)){ // opがchより演算子の優先順位が高い間 tmp=op; postfix+=tmp; // postfixの末尾に追加 register_stack.pop(); // スタックからポップしopに次の演算子を op=register_stack.top(); } // 現在の演算子をスタックにプッシュ register_stack.push(ch); break; // 左括弧である case '(': register_stack.push('('); break; // 右括弧である case ')': op=register_stack.top(); while(op!='('){ tmp=op; postfix+=tmp; // 末尾に追加 register_stack.pop(); // ポップする op=register_stack.top(); } // 最後に ( をポップ register_stack.pop(); break; } } return postfix; } // 引数の後置式を評価して値を返す int CExpresion::Eval(string &exp){ //************* 後置式の評価アルゴリズム **************** // 1. 引数の式を1文字ずつ評価し、数値ならスタックにプッシュ // 2. 演算子ならスタックから2個(なければ1個)ポップし、その // 演算子で評価し、その結果を再びスタックにポップする // 3. 後置式のラスまでいったら終了 //********************************************************** stack digit_stack; // 結果を格納するスタック int length=exp.length(); for(int i=0;i=0?true:false); } //-------------------------------------------------------- // CTicketクラス // 4桁の数字をメンバとして持ち // 可能な限りの式の列挙をメンバとしてもつ //---------------------------------------------------------------------- class CTicket{ public: CTicket(int); // コンストラクタ void MakeExpresion(); // 外部関数 queue expresions; // ここに式が保存される private: void SubMakeExpresion(string &,char *,int); // 実際に式を生成する bool isEmptyDigit(char *) const; // 数字は使い切ったか // 式に左/右括弧を挿入できるか bool isEnableInsertRightBrackets(string &,int &) const; bool isEnableInsertLeftBrackets(string &,int &,char *) const; int num; // コンストラクタに渡される整数 char digit[N_DIGIT]; // どの数字を使ったか const char NOTHING; // その数字は使えないことを表す定数 }; //---------------------------------------------------------------------- // CTicketクラス実装 //----------------------------------------------------------------------- // コンストラクタ CTicket::CTicket(int num) : NOTHING(-1){ // numは4桁、自然数である this->num=num; for(int i=N_DIGIT-1;i>=0;i--){ digit[i]=num%10+'0'; num/=10; } } // すべての桁の数字を使う任意の式を生成し、 // ベクタexpresionsにそれぞれを挿入 void CTicket::MakeExpresion(){ // MakeExpresionの補佐関数を呼び出す // 第1引数:今までの式が入っている文字列 // 第3引数:今までで使った数字 第4引数:今までの左括弧数 string exp; SubMakeExpresion(exp,digit,0); } // MakeExpresion()のサブ関数 void CTicket::SubMakeExpresion(string &e,char *d,int nLeftBrackets){ string exp; // 文字列式 string ch; // 一時変数 char digits[N_DIGIT]; // 使える数字の列挙(使えない数字はNOTING) for(int i=0;i0){ for(int i=0;i<3;i++){ int index=(exp.size()-1)-i; if(index<0 || exp[index]=='(') return false; } return true; } return false; } // 引数の文字列を調べ、左括弧を挿入できるかどうかを返す bool CTicket::isEnableInsertLeftBrackets(string &exp, int &nLeftBrackets,char *digits) const{ if(nLeftBrackets<1){ // 現在の左括弧が1より小さいなら // 現在の数値が1個以上残っていればOK int sum=0; for(int i=0;i=2?true:false); }else return false; } //-------------------------------------------------------------------------- // atoi()関数はに定義されているがいらない関数がついてくるので // ここでは自分で実装 int atoi(char *number){ int integer=0; bool positive=(number[0]=='-'?false:true); // 正か負か int i=(positive?0:1); for(;number[i]!=0;i++){ int digit=number[i]-'0'; if(digit>=0 && digit<=9){ // 数字である integer=10*integer+digit; }else return 0; } return positive?integer:-integer; } /*****************************************************************/ // CTicketクラスとCExpresionクラスのドライバプログラム void main(int argc,char *argv[]){ char *fname="ticket.txt"; if(argc==2) fname=argv[1]; // 出力ファイルオープン ofstream out(fname,ios::out); // 入力4桁整数 char integer[10]; int n; do{ cout<<"Input 4 figures integer:"; cin>>integer; n=atoi(integer); }while(n<1000 || n>=10000); // CTicketオブジェクトの生成と式の作成 CTicket ticket(n); ticket.MakeExpresion(); // 評価値が10になるものを見つける CExpresion *exp; int size=ticket.expresions.size(); for(int i=0;i
//          &n= bsp;=20 C++  Source Files
 
//--------------------------
// =20 =1B$BG$0U$N=1B(B4=1B$B7e$N<+A3?t$N3F7e$N=1B(B
//  = =1B$B?t;z$r=1B(B1=1B$B2s$:$D;H$$$=3D$N<0$N=1B(B
// =20 =1B$BCM$,=1B(B10=1B$B$K$J$k$b$N$r5a$a$k=1B(B
//    = ; Ticket.cpp
//--------------------------
 
#include <iostream>
#include=20 <fstream>
#include <string>
#include = <stack>
#include=20 <queue>
#define N_DIGIT 4
 
using namespace std;
 
//   = CExpresion=1B$B%/%i%9=1B(B
//  =20 =1B$BJ8;zNs<0$r%a%s%P$H$7$=3D$l$r=1B(B
//   = =1B$B5U%\!<%i%s%I5-K!=1B(B ->=20 =1B$B8eCV<0$rI>2A=1B(B
//---------------------------------------------= -----------
class=20 CExpresion{
 friend ostream &operator<<(ostream=20 &,CExpresion *);
public:
 CExpresion(string = &exp); =20 //  =1B$B%3%s%9%H%i%/%?=1B(B
 bool = operator=3D=3D(int);  // =20 =1B$B1i;;;R4X?t=1B(B
private:
 string = ConvertToPostfix();  // =20 =1B$B8eCV<0JQ49%W%m%7!<%8%c=1B(B
 int Eval(string = &);     // =20 =1B$B8eCV<0I>2A%W%m%7!<%8%c=1B(B
 bool isPriority(char,char) = const; // =20 =1B$BBh0l0z?t$N1i;;;R$OBhFs0z?t$N1i;;;R=1B(B
    &= nbsp;           &n= bsp;           &nb= sp;     =20 //  =1B$B$h$jM%@h=3Dg0L$,Bg$-$$$+=1B(B
 string = expresion;  // =20 =1B$B<0$rI=3D$9=1B(Bstring=1B$B%*%V%8%'%/%H=1B(B
};
//-------------= -------------------------------------------
 
//         &= nbsp;        =20 CExpresion=1B$B%/%i%9//-------------------------------------= -------------------
// =20 ostream=1B$B%*%V%8%'%/%H$K=1B(Bexp=1B$B$rA^F~=1B(B
ostream = &operator<<(ostream=20 &out,CExpresion=20 *exp){
 out<<exp->expresion;
 return=20 out;
}
 
//  = =1B$B%3%s%9%H%i%/%?=1B(B
CExpresion::CExpresion(string=20 &exp){
 expresion=3Dexp;
}
 
//  =1B$B1i;;;R4X?t=1B(B   = 10=1B$B$HEy$7$$$+=1B(B
bool=20 CExpresion::operator=3D=3D(int num){
 return=20 (Eval(ConvertToPostfix())=3D=3Dnum?true:false);
}
 
//  = expresion=1B$B%a%s%P$r5U%\!<%i%s%I5-K!=1B(B(=1B$B8eCM<0=1B(B)=1B$B$KJQ49=1B= (B
string=20 CExpresion::ConvertToPostfix(){
 //************   = =20 =1B$B8eCM<0JQ49%"%k%4%j%:%`=1B(B   = **************************
 //  1.=20 =1B$BCfCM<0$N:G8e$K1&3g8L=1B(B')'=1B$B$rA^F~=1B(B
 //  2. = =1B$B%9%?%C%/$K:83g8L$rA^F~=1B(B
 //  3.=20 =1B$BCfCM<0$r=1B(B1=1B$BJ8;z$:$DI>2A$7!"$=3D$NJ8;z$,?t;z$J$i$=3D$N$^$^=3D= PNO=1B(B
 //  4.=20 =1B$B1i;;;R$J$i$=3D$N1i;;;R$h$jM%@h=3Dg0L$,9b$$4V%9%?%C%/$+$i%]%C%W$9$k=1B= (B
 //  5.=20 =1B$B:83g8L$J$i%9%?%C%/$K%W%C%7%e$9$k=1B(B
 //  6.=20 =1B$B1&3g8L$J$i%9%?%C%/$N@hF,$,:83g8L$K$J$k$^$G%9%?%C%/$+$i=1B(B
 = ;//    =20 =1B$B%]%C%W$7!"%9%?%C%/$N@hF,$r%]%C%W$9$k=1B(B
 //***************= ****************************************************
 
 string infix,postfix;  // =20 =1B$BCfCM<05Z$S8eCM<0=1B(B
 infix=3Dexpresion+")"; = ; // =20 =1B$BCfCM<0$N%i%9$K1&3g8L$rA^F~=1B(B
 
 stack<char> register_stack;  = // =20 =1B$B1i;;;R!"3g8L$r3JG<$9$k%9%?%C%/=1B(B
    = register_stack.push('(');
 
 string tmp;  //  = =1B$B0l;~J8;zNsJQ?t=1B(B
 int=20 infix_index=3D0;
 while(!register_stack.empty()){
  = // =20 =1B$B?tCM$G$"$k=1B(B
  char ch=3Dinfix[infix_index];  = infix_index++;
 
  switch(ch){
 
   // =20 =1B$B?t;z$G$"$k=1B(B
      case '0': case = '1': case '2': case '3':=20 case '4':
   case '5': case '6': case '7': case '8': case=20 '9':
      tmp=3Dch; =20 postfix+=3Dtmp;
   break;
 
   //  = =1B$B1i;;;R$G$"$k=1B(B
   case '+':=20 case '-': case '*': case '/':
      char=20 op;
     =20 op=3Dregister_stack.top();
     =20 while(isPriority(op,ch)){  // =20 op=1B$B$,=1B(Bch=1B$B$h$j1i;;;R$NM%@h=3Dg0L$,9b$$4V=1B(B
  &= nbsp;    tmp=3Dop; =20 postfix+=3Dtmp;  // =20 postfix=1B$B$NKvHx$KDI2C=1B(B
      =20 register_stack.pop();  // =20 =1B$B%9%?%C%/$+$i%]%C%W$7=1B(Bop=1B$B$K  &= nbsp;   =20 op=3Dregister_stack.top();
     =20 }
      // =20 =1B$B8=3D:_$N1i;;;R$r%9%?%C%/$K%W%C%7%e=1B(B
    &= nbsp;=20 register_stack.push(ch);
   break;
 
   //  = =1B$B:83g8L$G$"$k=1B(B
   case=20 '(':
   =20 register_stack.push('(');
      = break;
 
   //  = =1B$B1&3g8L$G$"$k=1B(B
   case=20 ')':
           = ; =20 op=3Dregister_stack.top();
   =20 while(op!=3D'('){
     tmp=3Dop;  = postfix+=3Dtmp; // =20 =1B$BKvHx$KDI2C=1B(B
     = register_stack.pop();  // =20 =1B$B%]%C%W$9$k=1B(B
     = op=3Dregister_stack.top();
   =20 }
    //  =1B$B:G8e$K=1B(B ( = =1B$B$r%]%C%W=1B(B
   =20 register_stack.pop();
   break;
 =20 }
 }
 return postfix;
}
 
//  = =1B$B0z?t$N8eCV<0$rI>2A$7$FCM$rJV$9=1B(B
int CExpresion::Eval(string=20 &exp){
 //*************   = =1B$B8eCV<0$NI>2A%"%k%4%j%:%`=1B(B =20 ****************
 //  1.=20 =1B$B0z?t$N<0$r=1B(B1=1B$BJ8;z$:$DI>2A$7!"?tCM$J$i%9%?%C%/$K%W%C%7%e=1B(B=
 //  2.=20 =1B$B1i;;;R$J$i%9%?%C%/$+$i=1B(B2=1B$B8D=1B(B(=1B$B$J$1$l$P=1B(B1=1B$B8D=1B= (B)=1B$B%]%C%W$7!"$=3D$N=1B(B
 //    =20 =1B$B1i;;;R$GI>2A$7!"$=3D$N7k2L$r:F$S%9%?%C%/$K%]%C%W$9$k=1B(B
 /= /  3.=20 =1B$B8eCV<0$N%i%9$^$G$$$C$?$i=3D*N;=1B(B
 //*********************= *************************************
 
 stack<int> digit_stack;  = // =20 =1B$B7k2L$r3JG<$9$k%9%?%C%/=1B(B
 
    int=20 length=3Dexp.length();
 for(int = i=3D0;i<length;i++){
  char=20 ch=3Dexp[i];
 
  switch(ch){
 
   // =20 =1B$B?tCM$G$"$k=1B(B
      case '0': case = '1': case '2': case '3':=20 case '4':
   case '5': case '6': case '7': case '8': case=20 '9':
    digit_stack.push(ch-'0');  // =20 =1B$B?tCM$r%W%C%7%e=1B(B
   break;
 
         &nb= sp; =20 //  =1B$B1i;;;R$G$"$k=1B(B
   case '+': case '-': case = '*': case=20 '/':
      int x,y;  // =20 2=1B$B$D$NCM=1B(B
      = y=3Ddigit_stack.top(); =20 digit_stack.pop();  // = y=1B$B$r%]%C%W=1B(B
      // =20 =1B$B%9%?%C%/$,6u$G$J$1$l$P=1B(Bx=1B$B$KBeF~=1B(B
   &n= bsp;  // =20 =1B$B2?8N$3$N$h$&$K$9$k$+$H$$$&$H!"=1B(B-3=1B$B$J$I$N?t$,B8:_$9$k$?$a=1B(= B
     =20 if(!digit_stack.empty())
      =20 x=3Ddigit_stack.top();  digit_stack.pop();
 
      // =20 =1B$B1i;;;R$K$h$kI>2A=1B(B
      = if(ch=3D=3D'+')  //=20 +=1B$B1i;;=1B(B
      =20 digit_stack.push(x+y);
      else = if(ch=3D=3D'-') =20 // -=1B$B1i;;=1B(B
      =20 digit_stack.push(x-y);
      else = if(ch=3D=3D'*') =20 //  *=1B$B1i;;=1B(B
      =20 digit_stack.push(x*y);
      else = if(ch=3D=3D'/'){ =20 //  / = =1B$B1i;;$G$O1&%*%Z%i%s%I$G=1B(B0=1B$B$OIT@5=1B(B
   &n= bsp;  =20 if(y=3D=3D0)  return 0;  // = 0=1B$B=3D|;;$G$O$=3D$l0J>e$N7W;;$O9T$o$J$$=1B(B
 
      =20 if(x%y=3D=3D0)
         &= nbsp;=20 digit_stack.push(x/y);
      =20 else
           = ;       =20 // =20 =1B$B3d$j@Z$l$J$$$b$N$OIT2D=1B(B(=1B$B2?8N$J$i@Q1i;;$r3d$k1i;;$h$j$bM%@h$= 7$F$d$C$F$$$k$+$i=1B(B)
       &nbs= p;  =20 return 0;
      }
   = break;
 =20 }
 }
 //  = digit_stack=1B$B$+$i@hF,MWAG$rJV$9=1B(B
 return=20 (digit_stack.empty()?0:digit_stack.top());
}
 
//   = isPriority()=1B$B4X?t=1B(B
//  =20 =1B$B$3$3$G$O=1B(B*=1B$B1i;;$r=1B(B/=1B$B1i;;$h$j$b@h$K9T$&$[$&$,ET9g$,$$= $$$N$G=1B(B
//   =1B$B$3$N4X?t$G$O0c$/$9$k=1B(B
bool=20 CExpresion::isPriority(char op1,char op2) const{
 char = op[2]; =20 //  =1B$B1i;;;R=1B(B
 int op_priority[2];  //  = =1B$BM%@h=3Dg0L=1B(B
 
 op[0]=3Dop1;  = op[1]=3Dop2;
 for(int=20 i=3D0;i<2;i++){
   if(op[i]=3D=3D'(')  // (=20 =1B$B$O:GDc=1B(B
    = op_priority[i]=3D0;
     =20 else if(op[i]=3D=3D'+' || op[i]=3D=3D'-')  // = +,-=1B$B$O:GDc=1B(B
   =20 op_priority[i]=3D1;
   else = if(op[i]=3D=3D'/')
   =20 op_priority[i]=3D2;
   else = if(op[i]=3D=3D'*')
   =20 op_priority[i]=3D3;
 }
 return=20 (op_priority[0]-op_priority[1]>=3D0?true:false);
}
 
//-------------------------------------------------------= -
 
//   = CTicket=1B$B%/%i%9=1B(B
//  =20 4=1B$B7e$N?t;z$r%a%s%P$H$7$F;}$A=1B(B
//  =20 =1B$B2DG=3D$J8B$j$N<0$NNs5s$r%a%s%P$H$7$F$b$D=1B(B
//-----------------= -----------------------------------------------------
class=20 CTicket{
public:
 CTicket(int);  //  = =1B$B%3%s%9%H%i%/%?=1B(B
 void=20 MakeExpresion();  //  = =1B$B30It4X?t=1B(B
 queue<CExpresion *>=20 expresions;  //  = =1B$B$3$3$K<0$,J]B8$5$l$k=1B(B
private:
 void=20 SubMakeExpresion(string &,char *,int);  // =20 =1B$B bool isEmptyDigit(char *) = const;  // =20 =1B$B?t;z$O;H$$@Z$C$?$+=1B(B
 //  = =1B$B<0$K:8=1B(B/=1B$B1&3g8L$rA^F~$G$-$k$+=1B(B
 bool=20 isEnableInsertRightBrackets(string &,int &) const;
 bool = isEnableInsertLeftBrackets(string &,int &,char *) = const;
 int=20 num;  //  =1B$B%3%s%9%H%i%/%?$KEO$5$l$k@0?t=1B(B
 char = digit[N_DIGIT];  // =20 =1B$B$I$N?t;z$r;H$C$?$+=1B(B
 const char NOTHING;  //  = =1B$B$=3D$N?t;z$O;H$($J$$$3$H$rI=3D$9Dj?t=1B(B
};
//---------------= -------------------------------------------------------
 
//        =20 CTicket=1B$B%/%i%9//----------------------------------------= -------------------------------
 
//  = =1B$B%3%s%9%H%i%/%?=1B(B
CTicket::CTicket(int num) :=20 NOTHING(-1){
 // =20 num=1B$B$O=1B(B4=1B$B7e!"<+A3?t$G$"$k=1B(B
 this->num=3Dnum;
 
 for(int=20 i=3DN_DIGIT-1;i>=3D0;i--){
    =20 digit[i]=3Dnum%10+'0';
  num/=3D10;
 }
}
 
//  = =1B$B$9$Y$F$N7e$N?t;z$r;H$&G$0U$N<0$r@8@.$7!"=1B(B
// =20 =1B$B%Y%/%?=1B(Bexpresions=1B$B$K$=3D$l$>$l$rA^F~=1B(B
void = CTicket::MakeExpresion(){
 // =20 MakeExpresion=1B$B$NJd:44X?t$r8F$S=3DP$9=1B(B
 //  = =1B$BBh=1B(B1=1B$B0z?t=1B(B:=1B$B:#$^$G$N<0$,F~$C$F$$$kJ8;zNs=1B(B
&nb= sp;// =20 =1B$BBh=1B(B3=1B$B0z?t=1B(B:=1B$B:#$^$G$G;H$C$??t;z=1B(B   = =1B$BBh=1B(B4=1B$B0z?t=1B(B:=1B$B:#$^$G$N:83g8L?t=1B(B
 string=20 exp;
 SubMakeExpresion(exp,digit,0);
}
 
//  = MakeExpresion()=1B$B$N%5%V4X?t=1B(B
void=20 CTicket::SubMakeExpresion(string &e,char *d,int=20 nLeftBrackets){
 string exp;  // = =1B$BJ8;zNs<0=1B(B
 string ch; =20 //  =1B$B0l;~JQ?t=1B(B
 char digits[N_DIGIT];  = // =20 =1B$B;H$($k?t;z$NNs5s=1B(B(=1B$B;H$($J$$?t;z$O=1B(BNOTING)
 
 for(int i=3D0;i<N_DIGIT;i++) =20 digits[i]=3Dd[i];
 
 // =20 1=1B$B$DA0$KCV$$$?1i;;;R!"?t;z!"3g8L$K$h$kJ,4t=1B(B
 if(e.empty()= ){
  // =20 =1B$B:G=3Di$KCV$1$k$N$O?t;z!":83g8L=1B(B
  for(int = i=3D0;i<N_DIGIT;i++){
   char=20 c=3Ddigits[i];
   if(c!=3DNOTHING){  // =20 =1B$B;H$($k?t;z$rA*$V=1B(B
    char = temp=3Ddigits[i];
   =20 exp=3Dc;
    = digits[i]=3DNOTHING;
   =20 SubMakeExpresion(exp,digits,nLeftBrackets);
   =20 digits[i]=3Dtemp;
   }
  }
  //  = =1B$B:83g8L=1B(B
 =20 SubMakeExpresion(string("("),digits,nLeftBrackets+1);
 = }else{   =20 //  =1B$B$=3D$l0J9_$NJ8;z=1B(B
  exp=3De;  //  = e=1B$B$r=1B(Bexp=1B$B$K%3%T!<=1B(B
 
  //  = =1B$B:G8e$NJ8;z$r>H9g=1B(B
 =20 switch(exp[exp.size()-1]){
   // =20 =1B$BA0$NJ8;z$,?t;z$^$?$O1&3g8L$G$O1i;;;R$+1&3g8L=1B(B
  &nb= sp;   case '0': case '1':=20 case '2': case '3': case '4':
      case = '5': case=20 '6': case '7': case '8': case '9':
   case = ')':
 
    = if(!isEmptyDigit(digits)){ =20 //  = =1B$B?t;z$O;H$$@Z$C$F$J$$=1B(B
      &nb= sp; // =20 =1B$B1i;;;R=1B(B
        char=20 operators[]=3D"+-*/";
      &n= bsp;=20 for(int=20 i=3D0;i<N_DIGIT;i++){
       &nb= sp;=20 ch=3Doperators[i];
        =20 SubMakeExpresion(exp+ch,digits,nLeftBrackets);
    = ;=20 }
       =20
           &nb= sp;       =20 //  = =1B$B1&3g8L$rA^F~$G$-$k$J$iA^F~=1B(B
    =20 if(isEnableInsertRightBrackets(exp,nLeftBrackets))
   &= nbsp;       =20 SubMakeExpresion(exp+")",digits,nLeftBrackets-1);
 
    }else{  // =20 =1B$B?t;z$O;H$$@Z$C$F$$$k$N$G1&3g8L$rI,MW$K1~$8$F=1B(B
  &nb= sp;     =20 //  = =1B$BIU$12C$(!"=3DPMh>e$,$C$?<0$r%-%e!<$KDI2C=1B(B
   &= nbsp; for(int=20 i=3D0;i<nLeftBrackets;i++) =20 exp+=3D")";
     expresions.push(new=20 CExpresion(exp));
    }
   = break;
 
   // =20 =1B$BA0$NJ8;z$,1i;;;R$+:83g8L$J$i?t;z$^$?$O:83g8L=1B(B
   = case '+':  case '-':  case=20 '*':  case '/':  case '(':
 
    //  = =1B$B?t;z$NNs5s=1B(B
   =20 for(int i=3D0;i<N_DIGIT;i++){
    =20 if(digits[i]!=3DNOTHING){
       &n= bsp;           &nb= sp;   =20 char temp=3Ddigits[i];  // =20 digits[i]=1B$B$r%a%b%j$KB`Hr=1B(B
      = digits[i]=3DNOTHING; =20 //  digits[i]=1B$B$r;H$C$?=1B(B
      = // =20 exp=1B$B$NKvHx$K$D$J$2$F:F$S:F5"=1B(B
      = ch=3Dtemp;=20 SubMakeExpresion(exp+ch,digits,nLeftBrackets);
    = ; =20 digits[i]=3Dtemp;  //  = =1B$B85$KLa$9=1B(B
    =20 }
    }
    // =20 =1B$B:83g8L$rA^F~$G$-$k$J$iA^F~$7$F:F$S:F5"=1B(B
   =20 if(isEnableInsertLeftBrackets(exp,nLeftBrackets,digits))
  &= nbsp;    =20 SubMakeExpresion(exp+"(",digits,nLeftBrackets+1);
 
   break;
 =20 }
 }
}
 
//  = =1B$B0z?t$N?t;zJ8;zG[Ns$,;D$C$F$$$k$+=1B(B
bool=20 CTicket::isEmptyDigit(char *digits) const{
 for(int=20 i=3D0;i<N_DIGIT;i++){
  = if(digits[i]!=3DNOTHING)
   return=20 false;
 }
 return true;
}
 
//  = =1B$B0z?t$NJ8;zNs$rD4$Y!"1&3g8L$rA^F~$G$-$k$+$I$&$+$rJV$9=1B(B
bool=20 CTicket::isEnableInsertRightBrackets(string &exp,int = &nLeftBrackets)=20 const{
 //  = =1B$B8=3D:_$N%$%s%G%C%/%9$+$i@hF,J}8~$K=1B(B3=1B$B$DJ8;z$rD4$Y=1B(B
&n= bsp;// =20 +,-,(=1B$B$,$"$l$PA^F~$OIT2D=1B(B
 if(nLeftBrackets>0){
&nb= sp;   =20 for(int i=3D0;i<3;i++){
      int=20 index=3D(exp.size()-1)-i;
      = if(index<0 ||=20 exp[index]=3D=3D'(')
       return = false;
 =20 }
  return true;
 }
 return = false;
}
 
//  = =1B$B0z?t$NJ8;zNs$rD4$Y!":83g8L$rA^F~$G$-$k$+$I$&$+$rJV$9=1B(B
bool=20 CTicket::isEnableInsertLeftBrackets(string=20 &exp,
          = int=20 &nLeftBrackets,char *digits) = const{
 if(nLeftBrackets<1){ =20 //  =1B$B8=3D:_$N:83g8L$,=1B(B1=1B$B$h$j>.$5$$$J$i=1B(B
  = //  = =1B$B8=3D:_$N?tCM$,=1B(B1=1B$B8D0J>e;D$C$F$$$l$P=1B(BOK
  int=20 sum=3D0;
  for(int i=3D0;i<N_DIGIT;i++)=20 sum+=3D(digits[i]!=3DNOTHING?1:0);
  return=20 (sum>=3D2?true:false);
 }else
  return = false;
}
 
//-------------------------------------------------------= -------------------
 
// =20 atoi()=1B$B4X?t$O=1B(B<stdlib.h>=1B$B$KDj5A$5$l$F$$$k$,$$$i$J$$4X?t= $,$D$$$F$/$k$N$G=1B(B
//  =1B$B$3$3$G$O<+J,$Gint=20 atoi(char *number){
 int integer=3D0;
 bool=20 positive=3D(number[0]=3D=3D'-'?false:true);  //  = =1B$B@5$+Ii$+=1B(B
 
 int=20 i=3D(positive?0:1);
 for(;number[i]!=3D0;i++){
  int=20 digit=3Dnumber[i]-'0';
  if(digit>=3D0 && = digit<=3D9){ // =20 =1B$B?t;z$G$"$k=1B(B
   = integer=3D10*integer+digit;
  }else
  =20 return 0;
 }
 return=20 positive?integer:-integer;
}
 
/********************************************************= *********/
// =20 CTicket=1B$B%/%i%9$H=1B(BCExpresion=1B$B%/%i%9$N%I%i%$%P%W%m%0%i%`=1B(Bvoid main(int argc,char=20 *argv[]){
 
 char=20 *fname=3D"ticket.txt";
 if(argc=3D=3D2) =20 fname=3Dargv[1];
 
 //  = =1B$B=3DPNO%U%!%$%k%*!<%W%s=1B(B
 ofstream=20 out(fname,ios::out);
 
 //  = =1B$BF~NO=1B(B4=1B$B7e@0?t=1B(B
 char=20 integer[10];
 int n;
 do{
  = cout<<"Input 4=20 figures integer:";
    =20 cin>>integer;
  = n=3Datoi(integer);
 }while(n<1000 ||=20 n>=3D10000);
 
 //  = CTicket=1B$B%*%V%8%'%/%H$N@8@.$H<0$N:n@.=1B(B
 CTicket=20 ticket(n);
 ticket.MakeExpresion();
 
 //  = =1B$BI>2ACM$,=1B(B10=1B$B$K$J$k$b$N$r8+$D$1$k=1B(B
 CExpresion=20 *exp;
 int size=3Dticket.expresions.size();
 for(int=20 i=3D0;i<size;i++){
  = exp=3Dticket.expresions.front();
 =20 if(*exp=3D=3D10){
     =20 out<<exp<<endl;
     =20 cout<<exp<<endl;
  }
 =20 ticket.expresions.pop();
 }
}
/****************************= ****************************************/
 
 
//       =20 Result
Input 4 figures=20 integer:6789
6+8/(9-7)
6-8/(7-9)
6*(7+8)/9
6*(8+7)/9
8*(9-= 7)-6
8/(9-7)+6
(7+8)*6/9
(8+7)*6/9
(9-7)*8-6

 
------=_NextPart_000_000D_01BE9CA0.3543F8A0--