- 締切済み
条件にあう2桁の足し算の選択
1から9までの数字から任意に6個選択して、それらを一回ずつ使い、2桁の整数と2桁の整数の足し算の結果が2桁になる数字の組み合わせを求めるプログラムの作成なんですが、さっぱりです。 例、1 2 3 4 6 7 37+24=61 34+27=61 こんな感じで、組み合わせを求めるんですが、 任意に6個取り出すところや、一回ずつだけ使うのをどうしらいいんでしょうか?わかる人がいたら、教えてもらえますか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- fortranxp
- ベストアンサー率26% (181/684)
やっと完全版が完成しました。 相当なボログラムですが返って参考になるでしょう。 public class Sample253 { public static void main(String[] args){ String[] A={"1","2","3","4","5","6","7","8","9"}; String B=""; String c0=""; String c1=""; String c2=""; int i=0; int f1=0; int f2=0; int f3=0; int flag1=0; int flag2=0; int s0=0; for(int s1=0;s1<9;s1++){ for(int s2=0;s2<9;s2++){ for(int s3=0;s3<9;s3++){ for(int s4=0;s4<9;s4++){ B=A[s1]+A[s2]+A[s3]+A[s4]; //System.out.print(" "+B[s0]); if(A[s1].equals(A[s2]) || A[s1].equals(A[s3]) || A[s1].equals(A[s4]) || A[s2].equals(A[s3]) || A[s2].equals(A[s4]) || A[s3].equals(A[s4]) ){ flag1=1;} if(flag1==0){ for(int j=0;j<4;j++){ //合計の数値が足す数と一致しないかどうか? f1=Integer.parseInt(B.substring(0,1)+B.substring(1,2)); f2=Integer.parseInt(B.substring(2,3)+B.substring(3,4)); f3=f1+f2; if((f3)<100){ c0=Integer.toString(f3); c1=c0.substring(0,1); c2=c0.substring(1,2); if(c1.equals(B.substring(j,j+1)) || c1.equals("0")){ flag2=1;} if(c2.equals(B.substring(j,j+1)) || c2.equals("0")){ flag2=1;} if(c1.equals(c2)){ flag2=1;} } } //forを抜ける。 if(flag2==0 && f3<100){//ダブリの数値でないときはprint i=i+1; System.out.print("答え"+i+"は="+f1+"+"+f2+"="); System.out.println(f1+f2); }else{ flag2=0;} }else{ flag1=0;} } } } } } }
- fortranxp
- ベストアンサー率26% (181/684)
別に全ての組み合わせを求めなくてOKならば こんな方法もあります。 public class Sample251 { public static void main(String[] args){ int flag3=0; while(flag3<1){ //1回の処理では答えが出ないので出るまで繰り返す int[] A=new int [9]; String[] B=new String[9]; String c0=""; String c1=""; String c2=""; int i=0; int f1=0; int f2=0; int f3=0; int flag1=0; int flag2=0; for(int k=0;k<9;k++){ //数字はダブらない4けたから2桁ずつ組み合わせるが残り5桁も配列に格納。 flag1=0; flag2=0; while(flag1<1){ i=(int)Math.floor(Math.random()*9)+1; //1から9の数をランダムに発生してiに代入。 for(int j=0;j<9;j++){ if(A[j]==i){//配列A[]に同じ数があればflag2=1。 flag2=1; } } if(flag2==1){//flag2==1ならばflag2=0,flag1=0 flag2=0; flag1=0;//flag1=0なのでwhileループを繰り返す。 }else{ A[k]=i;//flag2==0ならば配列A[]にiを代入 B[k]=Integer.toString(i); flag1=1;//flag1=1にしてwhileを抜ける。 } } //whileloop ここまで } flag1=0; flag2=0; for(int j=0;j<4;j++){ for(int k=0;k<4;k++){ for(int l=0;l<4;l++){ for(int m=0;m<4;m++){ if(j==k || j==l || j==m || k==l || k==m || l==m){ break; } System.out.println(B[j]+" "+B[k]+" "+B[l]+" "+B[m]); f1=Integer.parseInt(B[j]+B[k]); f2=Integer.parseInt(B[l]+B[m]); f3=f1+f2; if((f3)<100){ c0=Integer.toString(f3); c1=c0.substring(0,1); c2=c0.substring(1,2); // System.out.println("c1="+c1+" c2="+c2); for(int p=4;p<9;p++){ if(c1.equals(B[p])){//配列にある組み合わせに使用しなかった数字と一致するとflag1=1。 flag1=1; } else if(c2.equals(B[p])){ flag2=1; } else if(c1==c2){ flag1=1; } } if(flag1==1 && flag2==1){ flag1=0; flag2=0; System.out.print("答えは="+f1+"+"+f2+"="); System.out.println(f1+f2); flag3=1;//答えがあったときは終了するため。whileから抜ける。 } } } } } } } } }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1の方針で作成してみました。 ほんとだったら、ArrayList なんかを使って汎用的に作るべきなのかもしれませんけど・ ---------------------------------------------------------------- /* 1から9までの数字から任意に6個選択して、それらを一回ずつ使い、 2桁の整数と2桁の整数の足し算の結果が2桁になる数字の組み合わせを求める */ public class Permute { public static void 順列(int level, String selectList, String resultList){ if(level == 0){ int x,y,z; x = Integer.parseInt(resultList.substring(0,2)); y = Integer.parseInt(resultList.substring(2,4)); z = Integer.parseInt(resultList.substring(4)); if(x + y == z){ System.out.println("" + x + "+" + y + "=" + z); } } else { for(int i=0;i<selectList.length();i++){ String select = selectList.substring(i,i+1); 順列(level -1, selectList.replace(select, ""), resultList+select); } } return ; } public static void main(String[] args) { 順列(6, "123456789", ""); } }
- freedom560
- ベストアンサー率46% (80/173)
No.1さんの解答ほぼそのままですが、実装してみました。後は返り値を比較してください。 static int[][] get(int intarg[],int num) { if(num<=0) { int ans[][]={{}}; return ans; } int ret[][]=new int[permutation(intarg.length,num)][num]; for(int i=0;i<intarg.length;i++) { int head=0; int tmpint[]=new int[intarg.length-1]; int l=0; for(int j=0;j<intarg.length;j++) { if(i!=j) { tmpint[l++]=intarg[j]; } else { head=intarg[j]; } } int tmpret[][]=get(tmpint,num-1); for(int j=0;j<tmpret.length;j++) { ret[i*tmpret.length+j][0]=head; for(int k=0;k<tmpret[j].length;k++) { ret[i*tmpret.length+j][k+1]=tmpret[j][k]; } } } return ret; } static int permutation(int i,int j) { if(i>1 && j>=1 && i>=j) return i*permutation(i-1,j-1); else return 1; }
- fortranxp
- ベストアンサー率26% (181/684)
>任意に6個取り出すところや 1 2 3 4 6 7を配列に入れる。 配列 A[i]のiは(int)Math.floor(Math.Random()*10)で 求める。このとき同じ数字のiがきたらやり直す。 >一回ずつだけ使う 配列A[]より選んだ数字を配列B[]に入れておき 同じ数字がA[]より出てきたら数字の抽出作業を 繰り返す。 それでもうまくいかないかもしれないがトニカク やってみる。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
例えば、 順列(レベル,被選択リスト,選択リスト) のような関数があるとすると、 順列(6,[1,2,3,4,5,6,7,8,9],[]) のような状態で呼び出して、 呼び出されたレベルでは、 被選択リストから順に1つ選び、選んだ要素を取り除いたリストと、選んだ要素を付け加えたリストにしてさらに次のレベルを呼び出す とすると、 次のレベルは例えば 順列(5,[2,3,4,5,6,7,8,9],[1]) のようになり、 同様に 順列(0,[7,8,9],[1,2,3,4,5,6]) のようにレベルが0になったら、9個の要素のリストから1回ずつ選んだ6個の要素のリストができていることになります。 これで、9P6の順列が次々に得られることになります。 あとは、このレベルで、望む式を満足している組であるかテストすればいいでしょう。