- ベストアンサー
すでに昇順になっている配列
既に昇順になっている配列を手に入れる方法 を考えています。 例えば、3桁の配列を手に入れたい場合 0,0,1 0,0,2 ・ ・ ・ 8,9,9 のみを手に入れて 0,1,0 1,0,0 0,2,0 2,0,0 ・ ・ ・ 8,9,8 9,9,8 は考えない(表示しない)、というものです。 思いついた方法が (1)3桁の数字をすべて(000から999まで)考える (2)各数字を配列にする (3)もし、昇順でなかったら、(1)に戻って数字を考え直す (4)昇順であれば、表示する。 というものです。 実際に、プログラムも作ってみました。 しかし 之では桁数が多くなるにつれて(例えば10桁など) 時間がかかりすぎてしまいます。 何か他に良い方法(アイディア、コレクションなど)をご存知の方いらっしゃいましたら、お力添えをお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じではどうでしょうか。 再帰を使用し、昇順になるように値を表示していきます。 import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { System.out.println("桁数を入力してください。"); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str=br.readLine(); int[] array=new int[Integer.parseInt(str)]; new Main().printSortedArray(array,0); } void printSortedArray(int[] array,int index) { if(index==array.length-1){ for(int i=(index==0)?0:array[index-1];i<10;i++){ array[index]=i; for(int j=0;j<array.length;j++){ System.out.print(array[j]+((j+1<array.length)?" ":"\n")); } } } else if(index<array.length-1){ for(int i=(index==0)?0:array[index-1];i<10;i++){ array[index]=i; this.printSortedArray(array,index+1); } } } }
その他の回答 (2)
- mackie01
- ベストアンサー率40% (4/10)
for(int i=0; i < 10; j++){ for(int j = 0; j < i; j++){ for(int k = 0; k < j; k++){ (k,j,iの配列を作る) } } } ではどうですか? 桁が多い場合は再帰的にすればいいと思います。
お礼
ご回答ありがとうございます。 おお、なるほど、眼から鱗が若干落ちてまいりました。。。 配列を再帰というのは天啓です・・・! もうすこし考えて見ます。 ありがとうございました。
補足
すみません、この場を借りて皆様に御礼を申し上げます。 nknk80さんにした補足質問の答えは 三項演算子というものでした。 基本的なことを質問してしまい、申し訳ありませんでした。 失礼致します。
- koko_u_
- ベストアンサー率18% (459/2509)
「手に入れる」の意味がわかりません。 >実際に、プログラムも作ってみました。 じゃあそれを補足にどうぞ。
補足
koko_u_さん 前回に引き続き、ご回答ありがとうございます。 プログラムは以下の通りです。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { private static int num; public static void main(String args[]) throws IOException{ System.out.println("桁数を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int a = Integer.parseInt(str); int b[] = new int[a]; a: for(int i = 0; i < Math.pow(10, a); i++){ num = i; if(i > Math.pow(10, a-1)){ for(int j=0; j < a; j++){ b[j] = num%10; num = i/10; } for(int j = 0; j < a-1; j++){ for(int k = j; k < a; k++){ if(b[j] > b[k]){ continue a; } } } for(int j=0; j < a; j++){ System.out.print(b[j]+" "); } System.out.println(); } } } } 桁数を入力すると、昇順になっている数字だけを表示します。 しかしこのプログラムは桁数が大きくなると飛んでしまうので 他にいい方法を模索中です。
お礼
ご回答ありがとうございます。 動かしてみたところ、見事に理想どおりに動いてくれました。 今はまだ動かしただけですので 一度考えてみて納得し次第、ポイントを献上いたしたいと存じます。 ありがとうございました!
補足
すみません、何とか考えてみたものの 高度すぎる為、以下の補足質問が出てきてしまいました。 今まで for(int i = 0; i < 10; i++) という書き方しかしておらず、nknk80さんがご回答下さったように for(int i=(index==0)?0:array[index-1];i<10;i++) という部分が分からず、困っております。 無知すぎて申し訳ありませんが、ご解答よろしくお願いいたします。