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

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

新規登録して質問してみよう
ただいま回答率
85.37%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1950閲覧

2つの文字列を交互に噛ませる?やり方を教えていただきたいです。

cunwe

総合スコア65

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/04/21 01:31

#問題文
すぬけ君は新しくできたプログラミングコンテストに会員登録しました。 登録に使ったパスワードを覚えておく自信が無かったすぬけ君は、 手元の紙にパスワードをメモしておくことにしました。 ただし、そのままメモをすると誰かにパスワードを盗まれてしまうかもしれないので、 文字列の偶数番目の文字と奇数番目の文字をそれぞれ別々の紙にメモしておくことにしました。

パスワードの奇数番目の文字だけを順番を変えずに取り出した文字列Oと、 偶数番目の文字だけを順番を変えずに取り出した文字列 Eが与えられます。すぬけ君のかわりにパスワードを復元してください。

#制約
・O, Eは小文字のアルファベット( a - z )からなる文字列
・1≤|O|,|E|≤50
・|O|−|E|は 0または1である。

とある中で自分は以下のようなコードを書きました。

#include <bits/stdc++.h> using namespace std; int main(){ string O,E; cin >> O >> E; int N=O.length(); int M=E.length(); for (int i=0;i<N;i+=2){ for (int j=1;j<M;j+=2){ cout << O[i]+E[j] << endl; } } }

これを手元で実行してみたところabc defと打ったらadbecfと出てきて欲しいのですが198 200と出てしまいました。僕のコードをご覧いただいたらなんとなく何がしたいかわかっていただけるかと思いますがどうしたら文字列Oと文字列Eを交互に出力できるようになりますでしょうか?

また解答PDFには以下のようなコードが書かれていました。

#include <iostream> using namespace std; int main (){ string E, O; cin >> E >> O; for (int i=0; i < E. size () ; i++) { cout << E[i]; if(i < O. size () ) cout << O[i]; } return 0; }

このコードが理解できません。これだとE.size以下かつO.size以下のときE[i]もO[i]も出力されそうですがちゃんと交互に出る要素がどこにあるのか教えていただきたいです。長文になってしまいましたがよろしくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/04/21 02:48

話を読む感じ,真っ先に出力されるべきは Oの最初の文字 な気がしますが,「解答PDF」のコードはそうなってないですね.パスワードの先頭文字を指して「0番目」と呼ぶ世界なのだろうか?
cunwe

2020/04/21 03:07

これをそのままコピペして提出したら通りました。。
fana

2020/04/21 03:14

2つのコードで入力の取得順が違う感じですし, 通るかどうかは,EとOのどっちが先に入力されるの?っていう仕様次第かと. (「Eとは何か? Oとは何か?」っていうのが入力の順序次第)
cunwe

2020/04/21 04:51

わかりました、ありがとうございます。
guest

回答1

0

ベストアンサー

これだとE.size以下かつO.size以下のときE[i]もO[i]も出力されそうですが

逆に、「E[i]もO[i]も出力され」ないと交互に結果が出力されないのではないでしょうか?

投稿2020/04/21 01:44

maisumakun

総合スコア145932

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/04/21 01:45

stringから1文字取り出すとcharになりますので、すでに結果として得られているように「O[i]+E[j]」は文字コードを数値として足し算が行われることとなります。
cunwe

2020/04/21 03:06

ご回答ありがとうございます。maisumakunさんの「逆に、「E[i]もO[i]も出力され」ないと交互に結果が出力されないのではないでしょうか?」についてなのですが確かにそうなのですが解答のコードでなぜ「交互に」出力されるのか教えていただけますか? また「stringから1文字取り出すとcharになりますので、すでに結果として得られているように「O[i]+E[j]」は文字コードを数値として足し算が行われることとなります。」については、ということは僕のやりたいことを実現をしようとすると冗長なコードになってしまいますね。。
maisumakun

2020/04/21 03:10

> 解答のコードでなぜ「交互に」出力されるのか教えていただけますか? E[0]、O[0]、E[1]、O[1]のように順に出力されていくので、出力結果は交互に出力されています。
cunwe

2020/04/21 04:52

そういう仕組みになっているので当然ながら交互に出力されるのですね、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問