• 締切済み

条件にあう2桁の足し算の選択

1から9までの数字から任意に6個選択して、それらを一回ずつ使い、2桁の整数と2桁の整数の足し算の結果が2桁になる数字の組み合わせを求めるプログラムの作成なんですが、さっぱりです。 例、1 2 3 4 6 7   37+24=61   34+27=61 こんな感じで、組み合わせを求めるんですが、 任意に6個取り出すところや、一回ずつだけ使うのをどうしらいいんでしょうか?わかる人がいたら、教えてもらえますか?

  • Java
  • 回答数6
  • ありがとう数0

みんなの回答

  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.6

やっと完全版が完成しました。 相当なボログラムですが返って参考になるでしょう。 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)
回答No.5

別に全ての組み合わせを求めなくて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)
回答No.4

#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", ""); } }

回答No.3

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)
回答No.2

>任意に6個取り出すところや 1 2 3 4 6 7を配列に入れる。 配列 A[i]のiは(int)Math.floor(Math.Random()*10)で 求める。このとき同じ数字のiがきたらやり直す。 >一回ずつだけ使う 配列A[]より選んだ数字を配列B[]に入れておき 同じ数字がA[]より出てきたら数字の抽出作業を 繰り返す。 それでもうまくいかないかもしれないがトニカク やってみる。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

例えば、 順列(レベル,被選択リスト,選択リスト) のような関数があるとすると、 順列(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の順列が次々に得られることになります。 あとは、このレベルで、望む式を満足している組であるかテストすればいいでしょう。

関連するQ&A

  • javaのプログラミングの質問です。

    1から9までの数字から任意に6 個を選択し、それらの数字を1 回ずつ使 い、二桁の整数と二桁の整数の足し算の結果が二桁になる数字の組み合わせを 求めるプログラムを作りなさい。プログラムは複数のクラスを定義して作成す ること。 例 1 2 3 4 6 7 37+24=61 34+27=61 全然手が付けられないので丸投げです。 ほんとに申し訳ないんですがおねがいします。 ソースコードをお願いします。

  • エクセル・解がある数字になるように足し算する数字を選ぶ方法

    いくつかの数字が並んでいて、その中から選んで足し算をします。 その足し算の答えがある範囲内に当てはまるような組み合わせを全部求めたいと思います。 分かりにくいので具体例を書きます。 0.5 1.1 1.8 2.3 3.8 4.2 上記の6個の数字からいくつか選んで足した結果が4.9~5.9になる組み合わせをすべて求めたいです。 この場合、 0.5+1.1+1.8+2.3=5.7 1.1+1.8+2.3=5.2 4.2+0.5=4.7 4.2+1.1=5.3 4.2+1.1+0.5=5.8 3.8+1.8=5.6 3.8+1.1=4.9 3.8+1.1+0.5=5.4 の8種類(もっとあったらごめんなさい)になると思います。 この8種類を書き出したいのですが、うまい方法が思い浮かびません。 ソルバーとかなのかと思って調べてみたのですが、計算式が確定していない場合は使えないみたいです。 やっぱりVBAを使わないと難しいでしょうか? なんとか簡単にできる方法があれば、アドバイス下さい。 よろしくお願いいたします。

  • 最大50桁の実数の和・差・積を求めたい

    C++で、2つの最大50桁の実数を入力して、その和・差・積を求めるプログラムを作りたいのです。 実数をchar型に入力させて、それを1桁ずつint型に変換したいのですが、どのようにやればよいのでしょうか? また、その際、符号や小数点はどうすればよいのでしょうか? 計算の流れとしては、 ○足し算 小数点を合わせる ⇒下位の桁から1桁ずつ足し算していく ⇒結果が10以上の場合、10を引き、左隣の桁の数字に1を加える ○引き算 小数点を合わせる ⇒下位の桁から1桁ずつ引き算していく ⇒引かれる数字のほうが引く数字より小さい場合、引かれる数字に10を足し、左隣の桁の引かれる数字から1を引く というような感じで考えているのですが、小数点の合わせ方がわかりません。 また、掛け算に関しては、筆算の要領でやろうと思うのですが、どのようにやればよいのでしょうか? 私はC++の勉強歴が短いので、できれば初心者向けのわかりやすい説明でお願いします。

  • 8桁までの足し算を教えてください。

    出力用紙の都合で、計算結果が最大8桁となる縦計算の結果を、 Excelで元数字、合計数字ともにセル1つに数字1つを入れるかたちで 表示させる式が欲しいのですが、私がこれまでに持っている知識 だけでは式がやたら長くなってしまいます。 例)A1~A8、A2~H2、A3~H3 の和をA4~H4に表示する場合 =MID(RIGHT(" "&(($A1&$B1&$C1&$D1&$E1&$F1&$G1&$H1)+($A2&$B2&$C2&$D2&$E2&$F2&$G2&$H2))+ ($A3&$B3&$C3&$D3&$E3&$F3&$G3&$H3)),8),COLUMN(A1),1) コレをA4に貼ってB4~H4にコピーペースト。 …というようなことしか思いつかないのですが、 たった3行の計算結果を表示したいだけでこんなに長くなってしまいます。 仮に20行分の計算結果を求めたいとしたら +($A*&$B*&$C*&$D*&$E*&$F*&$G*&$H*) の部分を20行分も後ろに書き連ねることになってしまいます。 これを『より簡単な式で』8分割された個々のセルに最大8桁の数の計算結果を 正しく表示させるための方法は無いでしょうか? テキストを図的に示す技量がないため大変解りづらくて申し訳ないのですが、 良い方法をご存知の方はぜひお教えください。

  • 足し算するプログラム

    タイトルの通りですが足し算をするプログラムを書いてみました。 第一引数を第二引数を足し算するのですが引数に「001」や「002」などの数字が入力された時に足し算した結果として素直に「00*」と足し算が出来ません。何かいい方法は無いでしょうか?教えてください。 import java.text.*; class Tashizan { public static void main(String[] args) { try { if(args.length == 0) { System.out.println("引数を整数値で入力して下さい。"); } else if(args.length == 1) { System.out.println("引数を整数値で2つ入力して下さい。"); } else if(args.length == 2) { int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); if(a <= 999999999 && b <= 999999999) { int wa = a + b; System.out.println(a + "+" + b + "の和は" + wa + "です。"); } else { System.out.println("入力した桁数を9桁以下か確認してください。"); } } else { System.out.println("引数は整数値で2つ入力して下さい。"); } } catch(NumberFormatException nfe) { System.out.println("整数値を2つ入力して下さい。"); } catch(Exception e) { System.out.println(e + "エラー発生!処理を終了します。"); } } }

    • ベストアンサー
    • Java
  • 数字5桁と10桁のパターンを作りたいのですが。。

    4月4日に数字4桁のパターンの作り方を質問し、 回答を頂き、4桁は解決しました。 (QNo.2893813 数字4ケタのパターンをつくりたいのですが・・ ) 今度は5桁と10桁のパターンを作りたいです。 (「乱数を作りたい」といった言い方が正しいのかもしれません) ■5桁の数:1~9までの数字の中から作る <例>14762、98426、39175、87214、、 ■10桁の数:1~10の数字から作る <例>1 3 4 8 9 2 5 7 6 10 どちらも、かぶらないように100~200パターンほど作りたいです。 エクセルの関数で出来る様ですが、エクセルはど素人なので、 前回の質問QNo.2893813 の回答no.5のようなプログラム自体をコピー&ペーストしてできるものが嬉しいです。 以下、前回頂いた回答の一部です ※回答いただいた方のお名前と、プログラムはここでは伏せます --------------------------------------------------------------- 作り方 Excelを起動→ツール→マクロ→visiual basic editor Visual Basic で 挿入→標準モジュール 出てきた画面に下のプログラムをコピー、ペースト 使い方 Excelでツール→マクロ→マクロ 『test』を選択して実行作り方 Excelを起動→ツール→マクロ→visiual basic editor Visual Basic で 挿入→標準モジュール 出てきた画面に下のプログラムをコピー、ペースト 質問が2回に分かれる形になってしまい、申し訳ありません。 知っている方いらっしゃいましたら、教えてください。

  • エクセルでの足し算(特定数を除きたい)

    エクセルでの足し算(特定数を除きたい) 行/セル A B C ・・・・ 1    1 3 7 2    2 1 1 3    3 2 1 上記のように一桁の数字が入ったデータがあるのですが、 このA~Cを足し算するときに、「7以上」の数字は足し算させたくありません。 例: 1行目・・・ A1+B2 = 4 (C1は無視) このような場合はどのような指定をすれば良いでしょうか。

  • 0と1の足し算について

    0と1の2進数の値を、足し算するプログラムを作成したいのですが、どのよに、桁を上げれば良いか解らないので教えてください。宜しくお願いします。 内容は次の通りです。 1.キーボードから入力されるものとし、入力される値は2進数と符号プラス(+)のみとします。加算する桁数は4桁とします。 2.2進数の値を加算させ、加算方法を記述したコードを用いる。 3.printf以外の関数は使用しない。 4.出力する際は、int型、char型でも構わない。 5.コマンドプロンプトを用いて、入力し出力する際は、以下の通りに出力する。 (入力例) 1111 + 1111 [Enter] (加算する値と値の間にプラスの符号(+)を入力させ[Enter]キーを入力。 (出力例) 1111 + 1111 = 11110 ([Enter]キーを押されたら式と、その合計を出力させる。

  • エクセルの関数について教えてください

    以下のようなことを計算させたいのですが、どのようにすればいいのかわかりません。どなたか教えてください。 1.一桁の整数の数字を足しこんだ結果、二桁の数字になったので、一桁目と二桁目をさらに足しこんで、最終的には一桁の数字にしたい。 2.ただし、二桁の数字になった時点で、「11」「22」や「14」「16」(そのほかにもありますが・・・)のようなある決めた特定の数字になった場合には、最終的な表示は「11/2」「22/4」や「14/5」「16/7」のように、二桁の結果とそれを足した一桁の結果を表示させたい。 このような関数ってあるのでしょうか。 探しましたが、見つけられなかったです。 関数の組み合わせだろうと思いますが、どれをどのように使ったらよいかわかりませんでした。 よろしくお願いします。

  • アセンブリ言語

    アセンブリ言語で『筆算的加減算』でプログラムを作成する演習問題が出ました。4月から習い出し全くわからないので参考にさせて頂きたいです。 実行例は⬇️ 1→123 2→456 計算→+  123 +456 --------  579 条件は 入力する2個の整数は正(+)のみとする。 入力する整数の桁数は3桁以内。 足し算は+、引き算はマイナス-を入力する。 負の値は入力しないが、結果の負('-')は表示する。 入力のエラー処理を行う。

専門家に質問してみよう