From g97p0807@mse.waseda.ac.jp Fri May 28 17:29:30 1999 Received: from wise19.mn.waseda.ac.jp (wise19.mn.waseda.ac.jp [133.9.4.137]) by newton.kashi.info.waseda.ac.jp (8.8.8/3.7W) with ESMTP id RAA11760 for ; Fri, 28 May 1999 17:29:30 +0900 (JST) Received: from wise20.mn.waseda.ac.jp (wise20.mn.waseda.ac.jp [133.9.4.141]) by wise19.mn.waseda.ac.jp (8.9.1a/3.7W-19980811) with ESMTP id RAA03822 for ; Fri, 28 May 1999 17:18:37 +0900 (JST) Received: from wise13.mn.waseda.ac.jp (wise13.mn.waseda.ac.jp [133.9.4.145]) by wise20.mn.waseda.ac.jp (8.9.1+3.0W/3.7W-19981111) with ESMTP id RAA16469 for ; Fri, 28 May 1999 17:18:36 +0900 (JST) Received: from pandora.mse.waseda.ac.jp (root@pandora.mse.waseda.ac.jp [133.9.5.9]) by wise13.mn.waseda.ac.jp (8.9.1a/3.7W-19980811) with ESMTP id RAA10269 for ; Fri, 28 May 1999 17:18:36 +0900 (JST) Received: from localhost (g97p0807@muse06.mse.waseda.ac.jp [133.9.5.38]) by pandora.mse.waseda.ac.jp (8.9.1+3.0W/3.7W) with ESMTP id RAA27552 for ; Fri, 28 May 1999 17:18:35 +0900 (JST) Message-Id: <199905280818.RAA27552@pandora.mse.waseda.ac.jp> To: kashi@mn.waseda.ac.jp Subject: [jsj] 4/23 report (make10) Date: Fri, 28 May 1999 17:18:33 +0900 From: FUKUSHIMA YUKIKO Status: OR make10 のプログラムの改良版です。 前に出したレポートに比べて、 1)並べ替えの際に変な数は出てこなくなりました。 2)分数を扱えるようにしました。 しかし、難問だけど答のある筈の(3478)の組について、 答が出ないという問題があります。 おそらく端の数から順に一つずつ演算していくというアルゴリ ズムが問題だと思います。 (今さらアルゴリズムから見直さなくてはならないというのも 苦しいものが・・・) -------- #include typedef struct f{ int c; /*分子*/ int m; /*分母*/ } fruc; /* 分数を表現する構造体 */ int N[4]; /* 数値を入れておく配列 */ int S[3]; /* 演算記号を入れておく配列 */ void print(void); void make10(int i,fruc n); void perm(int i); int main(void); /* 数式を出力する */ void print(void) { printf("((%d %c %d)%c %d)%c %d\n",N[0],S[0],N[1],S[1],N[2],S[2],N[3]); return; } /* 10を作る試行。再帰的 */ void make10(int i,fruc n) { fruc t; /* iが呼びだし回数,3回目の呼び出しで * * かつ計算結果が10なら出力 */ t=n; /* 加算をトライ */ S[i-1]='+'; n.c+=(N[i]*n.m); if(i<3){ make10(i+1,n);} else {if(n.c / n.m ==10 && n.c % n.m ==0) print();} n=t; /* 減算をトライ */ S[i-1]='-'; n.c-=(N[i]*n.m); if(i<3){ make10(i+1,n);} else {if(n.c / n.m ==10 && n.c % n.m ==0) print();} n=t; /* 乗算をトライ */ S[i-1]='*'; n.c*=N[i]; if(i<3){ make10(i+1,n);} else {if(n.c / n.m ==10 && n.c % n.m ==0) print();} n=t; if(N[i]!=0){ /* 除算をトライ */ S[i-1]='/'; n.m*=N[i]; if(i<3){ make10(i+1,n);} else {if(n.c / n.m ==10 && n.c % n.m ==0) print();} n=t; } return; } /* 順列による並べかえ。再帰的 */ void perm(int i) { int t,j; fruc n; if(i==0){ n.c=N[0]; n.m=1; make10(1,n); /* 並べ終ったら四則演算の試行 */ } else{ perm(i-1); for(j=i-1;j>=0;j--){ t=N[i]; N[i]=N[j]; N[j]=t; perm(i-1); t=N[i]; N[i]=N[j]; N[j]=t; } } return; } int main(void) { int i; /* 4つの数字を入力 */ printf("Input 4 numbers!\n"); for(i=0;i<4;i++){ printf("No.%d number? ",i+1); scanf("%d",&N[i]); } /* 並べかえて四則演算を行なう */ perm(3); return 0; } -------- ################################ # # # 福嶋 有希子 # # g97p0807@mse.waseda.ac.jp # # 早稲田大学理工学部情報学科 # # # ################################