teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

0を含む場合に出力しない制御の追加

2017/12/31 07:57

投稿

baseballyama
baseballyama

スコア316

answer CHANGED
@@ -2,11 +2,14 @@
2
2
  再帰処理を使用しないとすると以下のような処理が妥当なのではないかと思いました。
3
3
  ※但し私C++は書いたことがないので、javaをイメージして記載してしまいました。
4
4
  ※なので、不適当なプログラムを記載している部分があるかもしれません。
5
+ ※コメントを受けて修正しました。
5
6
 
6
7
  ```C++
7
8
  #include <iostream>
8
9
  #include <stdexcept>
9
10
  #include <string>
11
+ #include <sstream>
12
+ #include <iomanip>
10
13
  using namespace std;
11
14
 
12
15
  // char文字を int型 に変換(数字以外が来た場合は -1 を返却)
@@ -56,11 +59,13 @@
56
59
  bool printFlag = true;
57
60
 
58
61
  // 出力対象の数字を文字列に変換
62
+ std::ostringstream sout;
63
+ sout << std::setfill('0') << std::setw(5) << i;
59
- string str = std::to_string(i);
64
+ std::string str = sout.str();
60
65
 
61
66
  // 出力対象に max 以上の数値が含まれている場合は出力処理を実施しない
62
67
  for (int j = 0; j < (int) str.size(); j++) {
63
- if (ctoi(str[j]) > max) {
68
+ if (ctoi(str[j]) > max || ctoi(str[j]) == 0) {
64
69
  printFlag = false;
65
70
  break;
66
71
  }
@@ -69,10 +74,10 @@
69
74
  // 出力対象の場合は出力を実施
70
75
  if (printFlag) {
71
76
  cout << "[";
72
- int length = str.length();
77
+ int length = str.length();
73
78
  for (int j = 0; j < length; j++) {
74
79
  cout << str[j];
75
- if (length !=( j + 1)) {
80
+ if (length != (j + 1)) {
76
81
  cout << ", ";
77
82
  }
78
83
  }

1

回答に対するコメントを受けて、再度プログラムを書き直しました。

2017/12/31 07:57

投稿

baseballyama
baseballyama

スコア316

answer CHANGED
@@ -1,3 +1,104 @@
1
+ ご質問の内容を正確に把握せずに回答してしまいました。大変申し訳ございません。
2
+ 再帰処理を使用しないとすると以下のような処理が妥当なのではないかと思いました。
3
+ ※但し私C++は書いたことがないので、javaをイメージして記載してしまいました。
4
+ ※なので、不適当なプログラムを記載している部分があるかもしれません。
5
+
6
+ ```C++
7
+ #include <iostream>
8
+ #include <stdexcept>
9
+ #include <string>
10
+ using namespace std;
11
+
12
+ // char文字を int型 に変換(数字以外が来た場合は -1 を返却)
13
+ int ctoi(char c) {
14
+ switch (c) {
15
+ case '0':
16
+ return 0;
17
+ case '1':
18
+ return 1;
19
+ case '2':
20
+ return 2;
21
+ case '3':
22
+ return 3;
23
+ case '4':
24
+ return 4;
25
+ case '5':
26
+ return 5;
27
+ case '6':
28
+ return 6;
29
+ case '7':
30
+ return 7;
31
+ case '8':
32
+ return 8;
33
+ case '9':
34
+ return 9;
35
+ default:
36
+ return -1;
37
+ }
38
+ }
39
+
40
+ // len 文字数の数字を カンマ区切りで出力
41
+ // 但し max 以上の数字が入っている場合は出力を実施しない
42
+ // 出力例: [2,2,2,2,2]
43
+ void printNums(int len, int max) {
44
+
45
+ // 出力最大値を取得
46
+ string maxValue = "";
47
+ for (int i = 0; i < len; i++) {
48
+ maxValue = maxValue + std::to_string(max);
49
+ }
50
+ int maxvalue = std::stoi(maxValue);
51
+
52
+ // 0 から 出力最大値まで走査
53
+ for (int i = 1; i <= maxvalue; i++) {
54
+
55
+ // 出力対象フラグ初期化
56
+ bool printFlag = true;
57
+
58
+ // 出力対象の数字を文字列に変換
59
+ string str = std::to_string(i);
60
+
61
+ // 出力対象に max 以上の数値が含まれている場合は出力処理を実施しない
62
+ for (int j = 0; j < (int) str.size(); j++) {
63
+ if (ctoi(str[j]) > max) {
64
+ printFlag = false;
65
+ break;
66
+ }
67
+ }
68
+
69
+ // 出力対象の場合は出力を実施
70
+ if (printFlag) {
71
+ cout << "[";
72
+ int length = str.length();
73
+ for (int j = 0; j < length; j++) {
74
+ cout << str[j];
75
+ if (length !=( j + 1)) {
76
+ cout << ", ";
77
+ }
78
+ }
79
+ cout << "]" << endl;
80
+ }
81
+
82
+ }
83
+
84
+ }
85
+
86
+ // メイン処理
87
+ int main() {
88
+
89
+ // 5桁で全ての数字が2以下のものを出力
90
+ printNums(5, 2);
91
+
92
+ // 結果返却
93
+ return 0;
94
+
95
+ }
96
+ ```
97
+
98
+
99
+ ※以下当初の回答
100
+ /*******************************************************************/
101
+
1
102
  単純に for文 を4重に回すのではダメなのですか?
2
103
 
3
104
  ```C++