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

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

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

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

Q&A

解決済

1回答

235閲覧

vectorクラスで4桁の数字で奇数の数を判別したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2017/09/01 06:11

vectorクラスを使用して4桁内にある奇数の数を判定するものを作りたいです。
例えば、1342であれば2を、5761であれば3を返すものです。
以下のコードでは正しく判定されないです。

vector<int> t; int cnt = 0; int u[4]; int value = 0; cin >> value; t.push_back(value); cnt += count(t.begin(), t.end(), 1); cnt += count(t.begin(), t.end(), 3); cnt += count(t.begin(), t.end(), 5); cnt += count(t.begin(), t.end(), 7); cnt += count(t.begin(), t.end(), 9); cout << cnt << endl;

引用テキスト

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

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

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

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

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

guest

回答1

0

ベストアンサー

このようなことをしたいのでしょうか?

C++

1int value; 2std::cin >> value; 3 4int numOfOdd = 0; 5for(int i = 0; i < 4; i++) { 6 if(value % 2 == 1) { 7 numOfOdd++; 8 } 9 10 value /= 10; 11} 12 13std::cout << numOfOdd << std::endl;

もうちょっと柔軟にすると、次のような感じになるでしょう。

C++

1for(int val = value; val != 0; val /= 10) { 2 if(val % 2 == 1) { 3 numOfOdd++; 4 } 5}

vectorクラスは確かに配列のように複数の値を保管できます。
しかし、自動的に一桁一桁分解してくれるわけではありません。
どうしてもvectorを使いたいなら、こんな風な関数が必要かと。

C++

1// 整数を一桁一桁vectorにpush 2void pushEachDigit(std::vector<int> &dst, int num) { 3 dst.clear(); 4 dst.shrink_to_fit(); 5 6 for(; num != 0; num /= 10) { 7 dst.push_back(num % 10); 8 } 9}

C++

1inline bool isOdd(int num) { 2 return num % 2 == 1; 3} 4 5// vectorに格納された『奇数』の個数を返す 6int countOddDigit(const std::vector<int> &vec) { 7 int numOfOdd = 0; 8 for(auto elem: vec) { 9 if(isOdd(elem)) { 10 numOfOdd++; 11 } 12 } 13 return numOfOdd; 14}

そうすると、質問者様の書きたいコードはこんな構造になりますね。

C++

1int tsuika::argk(std::vector<int>& vec) { 2 int value = 0; 3 std::cin >> value; 4 5 puchEachDigit(vec, value); 6 int numOfOdd = countOddDigit(vec); 7 8 return numOfOdd; 9}

投稿2017/09/01 06:16

編集2017/09/01 07:28
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2017/09/01 06:44

とても苦戦していたのでこんなに簡単に記述できるなんて驚きました! ありがとうございます。 また機会があったら回答よろしくお願いします。 (以下が変更後のコードです) int tuika::argk(vector<int>& val) { int value=0; cin >> value; int numOfOdd = 0; for (int val = value; val != 0; val /= 10) { if (val % 2 == 1) { numOfOdd++; } } cout << numOfOdd << endl;
LouiS0616

2017/09/01 06:46

引数が全く使われていませんが、想定内でしょうか?
退会済みユーザー

退会済みユーザー

2017/09/01 07:04

すみません… "return 0;"記入忘れてました。
LouiS0616

2017/09/01 07:06

いえ、そっちじゃなくて、vector<int> &valのことです。 それにどうせreturnするならnumOfOddを返した方がよいのでは。
退会済みユーザー

退会済みユーザー

2017/09/01 07:06

ベストアンサーにさせていただきます。
退会済みユーザー

退会済みユーザー

2017/09/01 07:16

自分なにか勘違いしていたようです。 "vector<int> &val"にすることによってvectorを実現できる と解釈していました。 "return num;"は分かるのですが、こちらのコードをどのように してvectorにするのでしょうか?
退会済みユーザー

退会済みユーザー

2017/09/01 07:24

はやとちりで t.push_back(val); 付けてみるの忘れました。自分の範囲内では push_backどまりだと思います。
LouiS0616

2017/09/01 07:32 編集

追記しました。 しかし、本当にvectorを使う必要があるのか?という疑問は残ります。
退会済みユーザー

退会済みユーザー

2017/09/01 08:36

コード う~… 分からないです。もうちょっと勉強してみます。
LouiS0616

2017/09/01 09:44

どのあたりが分かりませんか?
退会済みユーザー

退会済みユーザー

2017/09/01 11:02

"/= 10"と"puchEachDigit(vec, value)"・"countOddDigit(vec)"(関数かと思い、 検索をかけたのですがどちらもヒットしません)がよくわかりません。 isOddの式も分からないです。
LouiS0616

2017/09/01 11:29

num /= 10; は、num = num / 10; と同じ意味です。 二つの関数はヒットしなくて当然です。この場で定義していますから。そういう意味では、情報はすべてこのページにあります。
LouiS0616

2017/09/01 11:30

isOddに関しては、次のように読み替えればいいかもしれません。処理の結果は同じです。 bool isOdd(int num) { ....if(num % 2 == 1) { ........return true; ....} ....else { ........return false; ....} } (空白を.で代替しています)
退会済みユーザー

退会済みユーザー

2017/09/04 10:13

遅れた返信になりすみません。 すみません やっぱりわかりません、pushEachDigit ではどのように値がpushされているのでしょうか? またclear()はvectorの初期化ということでしょうか?
LouiS0616

2017/09/04 13:11

clear()とshrink_to_fit()はここではセットで用いていて、目的は推測の通りvectorの要素の削除です。 ただ厳密に言うなら、初期化とは呼べないんですけどね。
LouiS0616

2017/09/04 13:14 編集

『どのように値がpushされているか』ロジックの話ですね。 これに関しましては、実際に紙かなにかに書いてみるとわかるかと思います。 for文を用いてやっていることは、以下のような感じです。 ____1. 1の位を取り出してベクトルにプッシュ。 ____2. 10で割って小数点以下を切り捨てる。 ____3. もしnumが0になっていたらfor文を終了。
退会済みユーザー

退会済みユーザー

2017/09/04 22:35

実際に区切って実行して おおかた分かることができた思います、助かりました ありがとうございます。 また良かったら回答よろしくお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問