質問編集履歴

7

まとめ

2018/10/18 14:58

投稿

opyon
opyon

スコア1009

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,55 @@
1
+ **回答やコメントでアドバイス頂いた皆様ありがとうございました。**
2
+
3
+ **色々なことが知れてとても参考になりました。**
4
+
5
+
6
+
7
+ ##まとめ
8
+
9
+ **生配列は関数から戻せない**が**クラスなどでは可能**
10
+
11
+ 今回の例ではstd::vector
12
+
13
+ 参考情報ではstd::arrayなど
14
+
15
+
16
+
17
+ **出力の書式はC++で統一する**(printfを混ぜない)
18
+
19
+ std::cout
20
+
21
+
22
+
23
+ 配列出力などは他言語のfor-eachでスッキリ
24
+
25
+ **range-based for**
26
+
27
+
28
+
29
+ 負の値になりえない要素数はunsignedな型を利用
30
+
31
+ 今回の例では**std::size_t** 変数名
32
+
33
+
34
+
35
+ 関数から戻り値を返す時に今どきのコンパイラなら
36
+
37
+ 自動判別して無駄なコピーはほぼ発生しない模様
38
+
39
+ **キーワードRVO,NRVO**
40
+
41
+
42
+
43
+ **0で埋める作業のほうが1で埋める作業より高速**
44
+
45
+ 今回の例では0埋めしたあとに1を代入する
46
+
47
+
48
+
49
+
50
+
51
+
52
+
1
53
  ##修正最終
2
54
 
3
55
  ```

6

修正最終

2018/10/18 14:58

投稿

opyon
opyon

スコア1009

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,141 @@
1
+ ##修正最終
2
+
3
+ ```
4
+
5
+ #include <cstdio> //名前空間に必須
6
+
7
+ #include <iostream> //入出力に必須
8
+
9
+ #include <vector> //std::vectorに必須
10
+
11
+ using namespace std; //名前空間指定
12
+
13
+
14
+
15
+ vector<int> get_primes(std::size_t n)
16
+
17
+ {
18
+
19
+ // 戻り値用
20
+
21
+ vector<int> primes(1, 2);
22
+
23
+ // 篩用
24
+
25
+ vector<int> sieve(n, 0);
26
+
27
+
28
+
29
+ std::size_t i, j, start, step;
30
+
31
+ sieve[2] = 1;
32
+
33
+
34
+
35
+ for (i = 3; i < n; i = i + 2)
36
+
37
+ {
38
+
39
+ sieve[i] = 1;
40
+
41
+ }
42
+
43
+
44
+
45
+ for (i = 3; i < n; i = i + 2)
46
+
47
+ {
48
+
49
+ if (sieve[i] == 1)
50
+
51
+ {
52
+
53
+ primes.push_back(i);
54
+
55
+ start = i * i;
56
+
57
+ step = i * 2;
58
+
59
+ for (j = start; j < n; j = j + step)
60
+
61
+ {
62
+
63
+ sieve[j] = 0;
64
+
65
+ }
66
+
67
+ }
68
+
69
+ }
70
+
71
+
72
+
73
+ // 確認用
74
+
75
+ for (auto &&prime : primes)
76
+
77
+ {
78
+
79
+ cout << prime << " ";
80
+
81
+ }
82
+
83
+ cout << endl;
84
+
85
+
86
+
87
+ return primes;
88
+
89
+ }
90
+
91
+
92
+
93
+ // 出力
94
+
95
+ void prt_primes(const vector<int> &primes)
96
+
97
+ {
98
+
99
+
100
+
101
+ //書き直し(リストのみ)
102
+
103
+ int i = 0;
104
+
105
+ for (auto &&prime : primes)
106
+
107
+ {
108
+
109
+ cout << prime << " ";
110
+
111
+ }
112
+
113
+ cout << endl;
114
+
115
+ }
116
+
117
+
118
+
119
+ int main()
120
+
121
+ {
122
+
123
+ const int n = 10;
124
+
125
+ prt_primes(get_primes(n));
126
+
127
+
128
+
129
+ return 0;
130
+
131
+ }
132
+
133
+
134
+
135
+ ```
136
+
137
+
138
+
1
139
  ##修正3
2
140
 
3
141
  初期値0,1の書き換えを逆にしてみました。

5

修正3

2018/10/18 14:42

投稿

opyon
opyon

スコア1009

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,131 @@
1
+ ##修正3
2
+
3
+ 初期値0,1の書き換えを逆にしてみました。
4
+
5
+
6
+
7
+
8
+
9
+ ```C++
10
+
11
+ #include <cstdio> //名前空間に必須
12
+
13
+ #include <iostream> //入出力に必須
14
+
15
+ #include <vector> //std::vectorに必須
16
+
17
+ using namespace std;//名前空間指定
18
+
19
+
20
+
21
+ vector<int> get_primes(int n){
22
+
23
+
24
+
25
+ // 戻り値用
26
+
27
+ vector<int> primes(1,2);
28
+
29
+ // 篩用
30
+
31
+ vector<int> sieve(n,0);
32
+
33
+
34
+
35
+ int i,start,step;
36
+
37
+ sieve[2] = 1;
38
+
39
+
40
+
41
+ for(i=3;i<n;i=i+2){
42
+
43
+ sieve[i] = 1;
44
+
45
+ }
46
+
47
+
48
+
49
+ for(i=3;i<n;i=i+2){
50
+
51
+ if (sieve[i] == 1){
52
+
53
+ primes.push_back(i);
54
+
55
+ start = i*i;
56
+
57
+ step = i*2;
58
+
59
+ for(int j = start;j<n;j=j+step){
60
+
61
+ sieve[j] = 0;
62
+
63
+ }
64
+
65
+ }
66
+
67
+ }
68
+
69
+
70
+
71
+ // 確認用
72
+
73
+ for(auto&& prime : primes) {
74
+
75
+ cout << prime << " ";
76
+
77
+ }
78
+
79
+ cout << endl;
80
+
81
+
82
+
83
+ return primes;
84
+
85
+ }
86
+
87
+
88
+
89
+ // 出力
90
+
91
+ void prt_primes(const vector<int>& primes){
92
+
93
+
94
+
95
+ //書き直し(リストのみ)
96
+
97
+ int i = 0;
98
+
99
+ for(auto&& prime : primes) {
100
+
101
+ cout << prime << " ";
102
+
103
+ }
104
+
105
+ cout << endl;
106
+
107
+ }
108
+
109
+
110
+
111
+ int main(){
112
+
113
+ const int n = 10;
114
+
115
+ prt_primes(get_primes(n));
116
+
117
+
118
+
119
+ return 0;
120
+
121
+ }
122
+
123
+
124
+
125
+ ```
126
+
127
+
128
+
1
129
  ##修正2
2
130
 
3
131
  ```C++

4

修正2

2018/10/18 14:25

投稿

opyon
opyon

スコア1009

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,127 @@
1
+ ##修正2
2
+
3
+ ```C++
4
+
5
+ #include <cstdio> //名前空間に必須
6
+
7
+ #include <iostream> //入出力に必須
8
+
9
+ #include <vector> //std::vectorに必須
10
+
11
+ using namespace std;//名前空間指定
12
+
13
+
14
+
15
+ vector<int> get_primes(int n){
16
+
17
+
18
+
19
+ // 戻り値用
20
+
21
+ vector<int> primes(1,2);
22
+
23
+ // 篩用
24
+
25
+ vector<int> sieve(n,1);
26
+
27
+
28
+
29
+ int i,start,step;
30
+
31
+ sieve[0] = 0;
32
+
33
+ sieve[1] = 0;
34
+
35
+
36
+
37
+ for(i=4;i<n;i=i+2){
38
+
39
+ sieve[i] = 0;
40
+
41
+ }
42
+
43
+
44
+
45
+ for(i=3;i<n;i=i+2){
46
+
47
+ if (sieve[i] == 1){
48
+
49
+ primes.push_back(i);
50
+
51
+ start = i*i;
52
+
53
+ step = i*2;
54
+
55
+ for(int j = start;j<n;j=j+step){
56
+
57
+ sieve[j] = 0;
58
+
59
+ }
60
+
61
+ }
62
+
63
+ }
64
+
65
+
66
+
67
+ // 確認用
68
+
69
+ for(auto&& prime : primes) {
70
+
71
+ cout << prime << " ";
72
+
73
+ }
74
+
75
+ cout << endl;
76
+
77
+
78
+
79
+ return primes;
80
+
81
+ }
82
+
83
+
84
+
85
+ // 出力
86
+
87
+ void prt_primes(const vector<int>& primes){
88
+
89
+
90
+
91
+ //書き直し(リストのみ)
92
+
93
+ int i = 0;
94
+
95
+ for(auto&& prime : primes) {
96
+
97
+ cout << prime << " ";
98
+
99
+ }
100
+
101
+ cout << endl;
102
+
103
+ }
104
+
105
+
106
+
107
+ int main(){
108
+
109
+ const int n = 10;
110
+
111
+ prt_primes(get_primes(n));
112
+
113
+
114
+
115
+ return 0;
116
+
117
+ }
118
+
119
+
120
+
121
+ ```
122
+
123
+
124
+
1
125
  ##修正1
2
126
 
3
127
  (素数のみのリストが帰るものを作り直す予定ですが取り急ぎここまで。)

3

修正1

2018/10/18 14:04

投稿

opyon
opyon

スコア1009

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,131 @@
1
+ ##修正1
2
+
3
+ (素数のみのリストが帰るものを作り直す予定ですが取り急ぎここまで。)
4
+
5
+ ```C++
6
+
7
+ #include <cstdio> //名前空間に必須
8
+
9
+ #include <iostream> //入出力に必須
10
+
11
+ #include <vector> //std::vectorに必須
12
+
13
+ using namespace std;//名前空間指定
14
+
15
+
16
+
17
+ vector<int> get_primes(int n){
18
+
19
+ std::size_t;
20
+
21
+ vector<int> primes(n,1);
22
+
23
+ int i,start,step;
24
+
25
+
26
+
27
+ primes[0] = 0;
28
+
29
+ primes[1] = 0;
30
+
31
+
32
+
33
+ for(i=4;i<n;i=i+2){
34
+
35
+ primes[i] = 0;
36
+
37
+ }
38
+
39
+
40
+
41
+ for(i=3;i<n;i=i+2){
42
+
43
+ if (primes[i] == 1){
44
+
45
+ start = i*i;
46
+
47
+ step = i*2;
48
+
49
+ for(int j = start;j<n;j=j+step){
50
+
51
+ primes[j] = 0;
52
+
53
+ }
54
+
55
+ }
56
+
57
+ }
58
+
59
+
60
+
61
+ // 確認用
62
+
63
+ for(int i=0;i<n;i++){
64
+
65
+ if (primes[i] == 1){
66
+
67
+ cout << i << " ";
68
+
69
+ }
70
+
71
+ }
72
+
73
+ cout << endl;
74
+
75
+
76
+
77
+ return primes;
78
+
79
+ }
80
+
81
+
82
+
83
+ // 出力
84
+
85
+ void prt_primes(const vector<int>& primes){
86
+
87
+
88
+
89
+ //書き直し(本来は素数のみのリストで良かったかも本題ではないので後回し)
90
+
91
+ int i = 0;
92
+
93
+ for(auto&& prime : primes) {
94
+
95
+ if (prime){
96
+
97
+ cout << i << " ";
98
+
99
+ }
100
+
101
+ i++;
102
+
103
+ }
104
+
105
+ cout << endl;
106
+
107
+ }
108
+
109
+
110
+
111
+ int main(){
112
+
113
+ const int n = 10;
114
+
115
+ prt_primes(get_primes(n));
116
+
117
+
118
+
119
+ return 0;
120
+
121
+ }
122
+
123
+
124
+
125
+ ```
126
+
127
+
128
+
1
129
  ##こういうことでしょうか???
2
130
 
3
131
  ちょっとまで自信ないのでコメント頂けると助かります。

2

解決??

2018/10/18 13:44

投稿

opyon
opyon

スコア1009

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,123 @@
1
+ ##こういうことでしょうか???
2
+
3
+ ちょっとまで自信ないのでコメント頂けると助かります。
4
+
5
+
6
+
7
+ ```
8
+
9
+ #include <cstdio> //名前空間に必須
10
+
11
+ #include <iostream> //入出力に必須
12
+
13
+ #include <vector> //std::vectorに必須
14
+
15
+ using namespace std;//名前空間指定
16
+
17
+
18
+
19
+ vector<int> get_primes(int n){
20
+
21
+ vector<int> primes(n,1);
22
+
23
+ int i,start,step;
24
+
25
+ n = primes.size();
26
+
27
+ primes[0] = 0;
28
+
29
+ primes[1] = 0;
30
+
31
+
32
+
33
+ for(i=4;i<n;i=i+2){
34
+
35
+ primes[i] = 0;
36
+
37
+ }
38
+
39
+
40
+
41
+ for(i=3;i<n;i=i+2){
42
+
43
+ if (primes[i] == 1){
44
+
45
+ start = i*i;
46
+
47
+ step = i*2;
48
+
49
+ for(int j = start;j<n;j=j+step){
50
+
51
+ primes[j] = 0;
52
+
53
+ }
54
+
55
+ }
56
+
57
+ }
58
+
59
+
60
+
61
+ // 確認用
62
+
63
+ for(int i=0;i<n;i++){
64
+
65
+ if (primes[i] == 1){
66
+
67
+ cout << i << " ";
68
+
69
+ }
70
+
71
+ }
72
+
73
+ printf("\n");
74
+
75
+
76
+
77
+ return primes;
78
+
79
+ }
80
+
81
+
82
+
83
+ // 出力
84
+
85
+ void prt_primes(const vector<int>& primes){
86
+
87
+ for(int i=0;i<primes.size();i++){
88
+
89
+ if (primes[i] == 1){
90
+
91
+ printf("%d ",i);
92
+
93
+ }
94
+
95
+ }
96
+
97
+ printf("\n");
98
+
99
+ }
100
+
101
+
102
+
103
+ int main(){
104
+
105
+ const int n = 10;
106
+
107
+ prt_primes(get_primes(n));
108
+
109
+
110
+
111
+ return 0;
112
+
113
+ }
114
+
115
+
116
+
117
+ ```
118
+
119
+
120
+
1
121
  ##追記
2
122
 
3
123
  (質問が分かりづらかったようなので追記します。)

1

追記

2018/10/18 12:52

投稿

opyon
opyon

スコア1009

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,51 @@
1
+ ##追記
2
+
3
+ (質問が分かりづらかったようなので追記します。)
4
+
5
+
6
+
7
+ 例えば他言語ですがPythonなら**呼び出し先の関数で配列を生成してそれを戻り値で返せます**。
8
+
9
+ 下記サンプルでしたら`result配列`です。
10
+
11
+ これと**同じことが出来そうにない**ので質問させていただきました。
12
+
13
+
14
+
15
+ **C言語だと呼び出し先の関数で配列を生成して戻り値で返せない**となると呼び出し元で生成するのがいいのかなと思ったのですが、間違っていたり何か他に良い方法などあればご教示頂けると助かります。
16
+
17
+
18
+
19
+ ```Python3
20
+
21
+ def calc(n):
22
+
23
+ result = []
24
+
25
+ for i in range(n):
26
+
27
+ result.append(i*i)
28
+
29
+ return result
30
+
31
+
32
+
33
+ def main():
34
+
35
+ print(*calc(10))
36
+
37
+
38
+
39
+ main()
40
+
41
+ # 0 1 4 9 16 25 36 49 64 81
42
+
43
+ ```
44
+
45
+
46
+
47
+
48
+
1
49
  ##知りたいこと
2
50
 
3
51
  配列データを関数で計算して処理したい場合は呼び出し元のmain()などで配列を生成して呼び出し先では参照渡し`&変数名`で受け取る方法が一般的標準的な方法という認識で合っていますか?