質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

初心者です。難易度高くて解けません。わかる方よろしくお願いします。

受付中

回答 0

投稿

  • 評価
  • クリップ 2
  • VIEW 623

omuretu

score 1

import java.util.Random;
import java.util.Scanner;

public class MyClass {

// 乱数を全体で共有
static Random rnd;

// 整数の単調増加配列を作成(増分0-2)
static int[] make_ints_s(int n) {
int[] x = new int[n];
int sum = 0;
for(int i = 0; i < n; i++) {
sum += (int)(Math.pow(rnd.nextDouble(), 2) * 3);
x[i] = sum;
}
return x;
}

// ランダムな英数文字列(2文字)配列を作成
static String[] make_strs(int n) {
char[] c_map = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
int c_len = c_map.length;
String[] strs = new String[n];
for(int i = 0; i < n; i++) {
char[] c_tmp = new char[2];
for(int j = 0; j < c_tmp.length; j++) {
c_tmp[j] = c_map[(int)(rnd.nextDouble() * c_len)];
}
strs[i] = new String(c_tmp);
}
return strs;
}

// 整数配列を表示
static void print_value(int[] x) {
for(int i = 0; i < x.length; i++) {
System.out.printf("%2d,", x[i]);
}
System.out.println();
}

// 文字列配列を表示
static void print_value(String[] x) {
for(int i = 0; i < x.length; i++) {
System.out.printf("%s,", x[i]);
}
System.out.println();
}

// 目盛を表示
static void print_index(int n) {
// 分かりやすさのため色付け(コンソールのみ)
System.out.print("index\033[4;103m|");
for(int i = 0; i < n; i++) {
System.out.printf("%2d|", i);
}
// 色付けをリセット
System.out.println("\033[0m");
}

// 探索位置の前までを空白で表示
static void print_presp(int n) {
for(int i = 0; i < n; i++) {
System.out.print("   ");
}
}

/* 二分探索(複数の値に対応)

  • 探索する値の配列中の位置を返す(途中経過も出力)
  • sv: 探索する値(整数)
  • x:  配列(整数)
    */
    /* 指示1ここから
  • 探索値がデータ列中に複数あっても全てを列挙できるよう
  • メソッド binarySearch2() を修正しなさい.
    */
    static int[] binarySearch2(int sv, int[] x) {
    int cnt = 1;
    int[] fi = new int[x.length+1];

int li = 0;
int ri = x.length - 1;

while(li <= ri) {  // 左端と右端が入れ替わったら終了
int i = (int)((li + ri) / 2);
System.out.printf("[%03d] ", cnt++);
print_presp(i);
if(x[i] == sv) {  // 発見したら
System.out.println("++ ");

while() {
System.out.printf("[%03d] ", cnt++);
print_presp(i);
System.out.println("++ ");

}
break;
}
else {
System.out.println("-- ");
}

if(x[i] < sv){
li = i + 1;  // 右に絞る
}
else {
ri = i - 1;  // 左に絞る
}
}
return fi;
}
// 指示1ここまで

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);

// 乱数を準備
System.out.print("乱数の種(入力が整数以外なら自動設定):");
// 整数が入力された場合は,それを種とする
if(scan.hasNextLong()) {
rnd = new Random(scan.nextLong());
}
else {
rnd = new Random();
scan.nextLine();  // 入力を捨てる
}

// 各変数の宣言
int[] x = make_ints_s(30);  // 整数データ列
String[] strs = make_strs(30);  // 対応する文字列の列
int sv;  // 探索値
int[] fi;  // 探索結果

// 探索値を設定(0-9)
System.out.print("探索値(入力が整数以外なら自動設定):");
// 整数以外が入力された場合は乱数(0-9)
if(scan.hasNextInt()) {
sv = scan.nextInt();
}
else {
sv = (int)(rnd.nextDouble()*10);
scan.nextLine();  // 入力を捨てる
}
System.out.println("");  // 改行のみ
scan.close();  // データ読み込みの完了

// ヘッダー部を表示
System.out.println(sv + "を探します");
print_index(x.length);
System.out.print("val_1 ");
print_value(x);
System.out.print("val_2 ");
print_value(strs);

// 二分探索を実施
fi = binarySearch2(sv, x);

// 結果を表示
System.out.print("val_1 ");
print_value(x);
System.out.print("val_2 ");
print_value(strs);
print_index(x.length);

/* 指示2ここから

  • 条件式を適切に補いなさい.
    */
    if() {
    System.out.println(sv + "は見つかりませんでした");
    }
    else {
    int i = 0;
    while(fi[i] >= 0) {
    System.out.println(sv + "は" + fi[i] + "番目にあります");
    System.out.println("対応する文字列は " + strs[fi[i]] + " です");
    i++;
    }
    }
    // 指示2ここまで
    }

}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • sazi

    2020/06/29 09:18

    解ける事より自分で考える事が一番大事。
    脳の訓練は本人の意思だけが頼りなので、悩めば悩むほど良いってもんです。

    キャンセル

  • asahina1979

    2020/06/29 09:31

    あなたが何がわからないのかわかりません(w

    キャンセル

  • 退会済みユーザー

    2020/06/29 16:38

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る