LoginSignup
blue-phoenix
@blue-phoenix

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

数列の問題について

Q&AClosed

以下の数列の問題が上手に解けません、応用問題でまたもや壁が。
自分にとって魔の領域たる分野の助力をお願いします。

「自然数 N, M と N 個の自然数からなる数列 A と M 個の自然数からなる数列 B があるとき、
1 行目には数列 A の最初の B_1 個の値を出力し、 2 行目にはその次から B_2 個の値を出力。
数列 A の値を B_1 個、B_2個、... B_M 個で分割し、それぞれの数列を出力せよ。」

数列1.png

今回はきちんと図を書いてみました、御指摘とテキストに則ってこう表します。
int n = 8;
int m = 3;

int[] a = new int[]{1,2,3,4,5,6,7,8};
int[] b = new int[]{2,5,1};
for (int i = 0; i < 3; i++) {
}
int ans = 0;
for (int x : b) {
  for (int i = 0; i < x; i++) {
    System.out.print(a[ans]);
    if (i < x - 1) {
      System.out.print(" ");
    } else {
      System.out.println();
    }
    ans = 1;
  }
}

}}

内容が内容だけに難しくて1つずつ確認するようにします。
int[] aが1~8まででnも8つ、int[] bが2,5,1の範囲でmが3つ。
すぐ以下のfor内に3を代入、標準入力ではないのでsc文は必要なし。
そして宿命たるans初期化ですが、今回必要ですよね?
別問題で出た命題を数列内に入れる方法でAの中にansを代入。
一旦a[ans]と表示、ここもOKですか?
終盤は0番目を引くためにi番目内のxから1つ引く・・・3行の内2行下げ。
ここが揺らぎやすく自信ないですが、前問で要素は0から始まるんじゃと
教わってきて比較間違えるなと指摘されて・・・番数から引くのか足すのか。
でも足したら位置がズレるからおかしいはず。最後はans有判定の1で終える。
“ ”は間隔空けてansの別枠に入れると学んで書いて、
ifは条件として出し抜くために書くはずでこうしました。
答えは
12
34567

となるはずですが、
12
22222

となってしまいます。いわゆる数字が順列できていなくて、3から認識されて
いないと思います。{ }の配置がおかしいのか、ヒントが見つからずに
まだどこかに穴があるというのか・・・もう頭痛い。
未熟者なのは理解できていますが、無理なのはやっぱり無理で。
javaがこんなに難しいなんて正直思っていなかったので。
どうすればこんな問題が作れるのか、だからといって引き下がるわけにもいかず。
是非、神の啓示をお願いしたいです・・・。

0

1Answer

printされるa配列のIndexは常にインクリメントされるべきであるので,

function test(){
	int a[] = new int[]{1,2,3,4,5,6,7,8};
	int b[] = new int[]{2,5,1};

	int a_index = 0;
	for (int x : b) {
	  for (int i = 0; i < x; i++) {
	    System.out.print(a[a_index]);
	    if (i < x - 1) {
	      System.out.print(" ");
	    } else {
	      System.out.println();
	    }
	    a_index=a_index+1;
	  }
	}
}

とかですかね?

出力は変わらないはずですけど改行の出力は,問題の意図的にはこっちの方が意味が通りますかね?

function test(){
	int a[] = new int[]{1,2,3,4,5,6,7,8};
	int b[] = new int[]{2,5,1};

	int a_index = 0;
	for (int x : b) {
	  for (int i = 0; i < x; i++) {
	    System.out.print(a[a_index]);
	    if (i < x - 1) {
	      System.out.print(" ");
	    }
	    a_index=a_index+1;
	  }

	  System.out.println();
	}
}
1

Comments

  1. @blue-phoenix

    Questioner
    これは・・・ansがindexに代わっていて最後のとこに+が書いてありますけど。
    どういう意味ですか?
  2. @blue-phoenix

    Questioner
    そんなバカなァ!!?? 解けました!!
    「a配列のIndexは常にインクリメントされるべき」
    インクリメント・・・+1、つまり+が足りなかっただけかああああああああ!?
  3. @blue-phoenix

    Questioner
    +、常にインクリメント、これで何故3,4,5~と表示されるんだ!!??
    そういえば、過去問で+=と書いてあったのがあったような・・・。
    うううううううううううう、おおおおおおおおおおおおおおおおお
  4. @blue-phoenix

    Questioner
    配列は常にインクリメント・・・肝に銘じておきます。
    フォロいたします、御告げありがとうございました。
  5. そういう訳では無いです.

    あくまで「この問題」ではB配列がどんな内容であっても,
    出力されるA配列は順次出力すべきなので,
    System.out.print(a[ans]);
    のans(自分の回答ではa_indexとしましたが)
    はインクリメントしていくのが正しい処理になるという話です.

    あくまで自分の回答はあそこでansを更新するならこうすると言う回答です.

    問題をどう捉えてコーディングするかは人それぞれですので,どの問題でも
    この書き方をすれば絶対正解というものはないです.

    別解です

    ```
    test(){
    int a[] = new int[]{1,2,3,4,5,6,7,8};
    int b[] = new int[]{2,5,1};

    int a_index_offset = 0;
    for (int x : b) {
    for (int i = 0; i < x; i++) {
    System.out.print(a[a_index_offset+i]);
    if (i < x - 1) {
    System.out.print(" ");
    }

    }
    a_index_offset=a_index_offset+x;
    System.out.println();
    }
    }
    ```
    コメントだとマークダウン効かないのか...
  6. @blue-phoenix

    Questioner
    offset・・・こんな記述もあるとは。
    また1つためになりました、今後の参考にしておきます。

Your answer might help someone💌