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

質問編集履歴

7

ソースコードの編集

2016/07/22 08:44

投稿

tomopichan2002
tomopichan2002

スコア17

title CHANGED
File without changes
body CHANGED
@@ -4,6 +4,9 @@
4
4
  例えば、b=2,c=3だと、a^2-3のようにして、
5
5
  for文で(a+1)^2-3のように変化させたいです。
6
6
  自分で組んでみたのですが、動きません。
7
+ 関数Yの宣言ののかのifで、エラーが出ます。
8
+ 表示された警告文:thread 1:EXE_BAD_ACCESS (code=2. address=0x7fff5f3ffffc)
9
+ 警告文を読んでも指示が書いてないので、わかりません。
7
10
  アドバイスをいただけると嬉しいです。
8
11
 
9
12
  ```c

6

ソースコードの修正

2016/07/22 08:44

投稿

tomopichan2002
tomopichan2002

スコア17

title CHANGED
File without changes
body CHANGED
@@ -12,84 +12,136 @@
12
12
 
13
13
  int main(void){
14
14
 
15
- //result_int = a^b-c
15
+ //式の編集 a^b-c = result
16
- //a_double,b_double,cは、ソースを編集して手動で入力する仕様にしようと思います
17
-
18
- double a_double = 9;
16
+ double a_double = 1;
19
- double b_double = 2;
17
+ double b_double = 1;
20
- unsigned c = 3;
18
+ unsigned c = 1;
21
-
22
19
  unsigned a_int,b_int,result_int;
20
+ unsigned square_root_of_result;
23
- unsigned square_root_of_result,primenumbercount,compositenumbercount;
21
+ unsigned primenumbercount = 0,compositenumbercount = 0;
24
- Unsgined i;
22
+ unsigned i;
23
+ int result_experimental;
24
+ unsigned result_processed;
25
25
 
26
- //最終的にaを増加させる予定のfor文です
26
+ //プロトタイプ宣言
27
+ int X();
28
+ int Y();
27
- //for(a_int=a_int;a_int<=100;a_int++){
29
+ //result_intが0や負の数にならないようにするための関数
28
30
 
31
+ for(a_double=a_double;a_double<=5;a_double++){
32
+
29
33
  double result_double = pow(a_double,b_double);
30
-
31
- //double型の値をunsigned型に代入します
34
+
32
35
  result_int = result_double;
33
36
  a_int = a_double;
34
37
  b_int = b_double;
35
38
 
39
+ if(a_int*b_int<=c){
40
+
41
+ a_double++;
42
+
43
+ X();
44
+
45
+ result_experimental = Y();
46
+
47
+ }
48
+
36
- result_int = result_int - c;
49
+ result_experimental = result_int - c;
37
50
 
38
- //配列prime_structureの定義
51
+ result_int = result_experimental;
39
- unsigned prime_structure[result_int];//0~result-1 result個
40
52
 
41
- for(i=0;i<result_int;++i){//0~result-1 添え字
53
+
42
54
 
43
- prime_structure[i] = 1;
55
+ unsigned prime_structure[result_int];
44
56
 
57
+ for(i=0;i<result_int;++i){
58
+
59
+ prime_structure[i] = 1;
60
+
45
- }
61
+ }
46
62
 
47
63
  prime_structure[0] = 0;//1は素数ではない
48
-
49
- for(i=0;i<result_int-1;++i){
50
-
51
- square_root_of_result = sqrt(result_int);
52
- printf("%d",square_root_of_result);
53
-
54
- }
55
-
56
- //エラトステネスのふるい
57
- for (i = 0; i < square_root_of_result; i++) {
58
64
 
59
- if (prime_structure[i] == 1){// prime[i]が素数なら
65
+ square_root_of_result = sqrt(result_int);
66
+
67
+ //エラトステネスのふるい
68
+ unsigned num,j;
69
+
70
+ for(i=0;i<square_root_of_result;i++){
60
71
 
61
- for (unsigned j = (i+1); (i+1) * j <= result_int-1; j++){
72
+ if(prime_structure[i] == 1){
62
73
 
63
- prime_structure[(i+1) * j - 1] = 0; // 素数の倍数は素数ではない
74
+ num=i+1;
64
75
 
76
+ for(j=num*2-1;j<result_int;j=num+j){
77
+
78
+ prime_structure[j]=0;
79
+
80
+ }
81
+
65
82
  }
66
83
 
67
84
  }
85
+ //エラトステネスのふるい fin
68
86
 
87
+ if(prime_structure[result_int-1] == 0){
88
+
89
+ printf("@%dは、素数\n",result_int);
90
+
91
+ primenumbercount++;
92
+
69
- }
93
+ }
94
+
95
+ else{
96
+
97
+ printf("@%dは、非素数\n",result_int);
98
+
99
+ compositenumbercount++;
100
+
101
+ }
102
+
103
+ double allcount = primenumbercount+compositenumbercount;//necessary
104
+ double primenumbercount_double = primenumbercount;
105
+ double probability = primenumbercount_double/allcount*100;//necessary
106
+ printf("a^%d-%dの確率は、%f%%です。\n",b_int,c,probability);//necessary
107
+
108
+ }//for fin
70
109
 
110
+ }//main fin
111
+
112
+
113
+ int rem(a_double,a_int,b_double,b_int,result_int,c,result_experimental){
114
+
115
+ double result_double = pow(a_double,b_double);
116
+
117
+ result_int = result_double;
118
+ a_int = a_double;
119
+ b_int = b_double;
120
+
71
- if(prime_structure[result_int-1] == 1){
121
+ result_experimental = result_int - c;
122
+
123
+ Y();
124
+
125
+ return 0;
126
+
127
+ }
128
+
129
+
130
+ int ram(result_experimental,result_processed){
131
+
132
+ if(result_experimental<0){
72
133
 
73
- printf("%dは、素数\n",result_int);
74
- primenumbercount++;
134
+ X();
75
135
 
76
- }
136
+ }
77
137
 
78
138
  else{
79
139
 
80
- printf("%dは、非素数\n",result_int);
140
+ result_processed = result_experimental;
81
- compositenumbercount++;
82
141
 
83
- }
142
+ }
84
-
85
- //}//for文の終了
86
-
87
- unsigned allcount = primenumbercount+compositenumbercount;
88
-
89
- double probability = primenumbercount/allcount;
90
143
 
91
- printf("a^%d-%d確率は、%fで。",b_int,c,probability);
144
+ return result_processed;//正数になったresultを返
92
145
 
93
-
94
- }//main関数の終わり
146
+ }
95
147
  ```

5

ソースコードの修正

2016/07/22 08:39

投稿

tomopichan2002
tomopichan2002

スコア17

title CHANGED
File without changes
body CHANGED
@@ -21,6 +21,7 @@
21
21
 
22
22
  unsigned a_int,b_int,result_int;
23
23
  unsigned square_root_of_result,primenumbercount,compositenumbercount;
24
+ Unsgined i;
24
25
 
25
26
  //最終的にaを増加させる予定のfor文です
26
27
  //for(a_int=a_int;a_int<=100;a_int++){
@@ -35,21 +36,25 @@
35
36
  result_int = result_int - c;
36
37
 
37
38
  //配列prime_structureの定義
38
- unsigned prime_structure[result_int-1];//0~result-1 result個
39
+ unsigned prime_structure[result_int];//0~result-1 result個
39
40
 
40
- for(unsigned i=0;i<=result_int-1;i++){//0~result-1 添え字
41
+ for(i=0;i<result_int;++i){//0~result-1 添え字
41
42
 
42
- prime_structure[result_int-1] = 1;
43
+ prime_structure[i] = 1;
43
44
 
44
45
  }
45
46
 
46
- prime_structure[0] = 0;
47
+ prime_structure[0] = 0;//1は素数ではない
48
+
49
+ for(i=0;i<result_int-1;++i){
50
+
51
+ square_root_of_result = sqrt(result_int);
52
+ printf("%d",square_root_of_result);
53
+
54
+ }
47
55
 
48
- square_root_of_result = sqrt(result_int);
49
- printf("%d",square_root_of_result);
50
-
51
56
  //エラトステネスのふるい
52
- for (unsigned i = 0; i < square_root_of_result; i++) {
57
+ for (i = 0; i < square_root_of_result; i++) {
53
58
 
54
59
  if (prime_structure[i] == 1){// prime[i]が素数なら
55
60
 
@@ -80,8 +85,10 @@
80
85
  //}//for文の終了
81
86
 
82
87
  unsigned allcount = primenumbercount+compositenumbercount;
88
+
89
+ double probability = primenumbercount/allcount;
83
90
 
84
- printf("a^%d-%dの確率は、%d/%dです。",b_int,c,primenumbercount,allcount);
91
+ printf("a^%d-%dの確率は、%fです。",b_int,c,probability);
85
92
 
86
93
 
87
94
  }//main関数の終わり

4

エラトステネスに変更

2016/07/21 23:39

投稿

tomopichan2002
tomopichan2002

スコア17

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  C言語のプログラムについての質問です。
2
- a^b-cの式の変数を変更して、算出された値が素数なのかどうかをエラトネスのふるいで
2
+ a^b-cの式の変数を変更して、算出された値が素数なのかどうかをエラトステネスのふるいで
3
3
  判定するプログラムを書こうとしています。
4
4
  例えば、b=2,c=3だと、a^2-3のようにして、
5
5
  for文で(a+1)^2-3のように変化させたいです。
@@ -48,7 +48,7 @@
48
48
  square_root_of_result = sqrt(result_int);
49
49
  printf("%d",square_root_of_result);
50
50
 
51
- //エラトネスのふるい
51
+ //エラトステネスのふるい
52
52
  for (unsigned i = 0; i < square_root_of_result; i++) {
53
53
 
54
54
  if (prime_structure[i] == 1){// prime[i]が素数なら

3

ソースの修正

2016/07/20 13:54

投稿

tomopichan2002
tomopichan2002

スコア17

title CHANGED
File without changes
body CHANGED
@@ -2,9 +2,8 @@
2
2
  a^b-cの式の変数を変更して、算出された値が素数なのかどうかをエラトネスのふるいで
3
3
  判定するプログラムを書こうとしています。
4
4
  例えば、b=2,c=3だと、a^2-3のようにして、
5
- For文で(a+1)^2-3のように変化させたいです。
5
+ for文で(a+1)^2-3のように変化させたいです。
6
6
  自分で組んでみたのですが、動きません。
7
- あと、type specifier missing.defaults to 'int'と警告文がでるのですがどうすれば解消されますか。
8
7
  アドバイスをいただけると嬉しいです。
9
8
 
10
9
  ```c
@@ -12,44 +11,51 @@
12
11
  #include <math.h>
13
12
 
14
13
  int main(void){
15
-
16
- unsigned power(unsigned a,b);//power関数の宣言
17
14
 
18
- //a^b-cの結果をresultとします。
15
+ //result_int = a^b-c
16
+ //a_double,b_double,cは、ソースを編集して手動で入力する仕様にしようと思います
19
17
 
20
- unsigned a = 3;
21
- unsigned b = 3;
18
+ double a_double = 9;
19
+ double b_double = 2;
22
20
  unsigned c = 3;
21
+
22
+ unsigned a_int,b_int,result_int;
23
- unsigned result,square_root_of_result,primenumbercount,compositenumbercount;
23
+ unsigned square_root_of_result,primenumbercount,compositenumbercount;
24
24
 
25
- for(a=a;a<=100;a++){//変数aを変化させるためのfor文です
25
+ //最終的にaを増加させる予定のfor文です
26
+ //for(a_int=a_int;a_int<=100;a_int++){
26
27
 
28
+ double result_double = pow(a_double,b_double);
29
+
30
+ //double型の値をunsigned型に代入します
27
- unsigned i = power(a,b);
31
+ result_int = result_double;
28
- result = i - c;//power関数の呼び出し resultの計算
32
+ a_int = a_double;
33
+ b_int = b_double;
34
+
29
- printf("%d",result);
35
+ result_int = result_int - c;
30
36
 
31
37
  //配列prime_structureの定義
32
- unsigned prime_structure[result-1];//0~result-1 result個
38
+ unsigned prime_structure[result_int-1];//0~result-1 result個
33
39
 
34
- for(unsigned i=0;i<=result-1;i++){//0~result-1 添え字
40
+ for(unsigned i=0;i<=result_int-1;i++){//0~result-1 添え字
35
41
 
36
- prime_structure[result-1] = 1;
42
+ prime_structure[result_int-1] = 1;
37
43
 
38
44
  }
39
45
 
40
46
  prime_structure[0] = 0;
41
47
 
42
- square_root_of_result = sqrt(result);
48
+ square_root_of_result = sqrt(result_int);
43
49
  printf("%d",square_root_of_result);
44
50
 
45
51
  //エラトネスのふるい
46
52
  for (unsigned i = 0; i < square_root_of_result; i++) {
47
53
 
48
- if (prime_structure[i] == 1){
54
+ if (prime_structure[i] == 1){// prime[i]が素数なら
49
55
 
50
- for (unsigned j = (i+1); (i+1) * j <= result-1; j++){
56
+ for (unsigned j = (i+1); (i+1) * j <= result_int-1; j++){
51
57
 
52
- prime_structure[(i+1) * j - 1] = 0;
58
+ prime_structure[(i+1) * j - 1] = 0; // 素数の倍数は素数ではない
53
59
 
54
60
  }
55
61
 
@@ -57,57 +63,26 @@
57
63
 
58
64
  }
59
65
 
60
- if(prime_structure[result-1] == 1){
66
+ if(prime_structure[result_int-1] == 1){
61
67
 
62
- printf("%dは、素数\n",result);
68
+ printf("%dは、素数\n",result_int);
63
69
  primenumbercount++;
64
70
 
65
71
  }
66
72
 
67
73
  else{
68
74
 
75
+ printf("%dは、非素数\n",result_int);
69
76
  compositenumbercount++;
70
77
 
71
78
  }
72
79
 
73
- }
74
-
75
- printf("a^%d-%dの確率は、%d/%dです。",b,c,primenumbercount,primenumbercount+compositenumbercount);
80
+ //}//for文の終了
76
-
77
-
78
- }
79
81
 
80
- //power関数の定義 pow関数はdouble型なのでint型のpower関数を作りました。
81
-
82
- unsigned power(unsigned a,b){
82
+ unsigned allcount = primenumbercount+compositenumbercount;
83
83
 
84
- unsigned result;
84
+ printf("a^%d-%dの確率は、%d/%dです。",b_int,c,primenumbercount,allcount);
85
-
86
- if(b==1){
87
-
88
- result = a;
89
-
90
- }
91
85
 
92
- else if(b==2){
93
-
94
- result = a*a;
95
-
96
- }
97
86
 
98
- else{
99
-
100
- result = a*a;
101
-
102
- for(unsigned i = b-2;i>=0;--i){
103
-
104
- result = result*a;
87
+ }//main関数の終わり
105
-
106
- }
107
-
108
- }
109
-
110
- return result;
111
-
112
- }
113
88
  ```

2

ソースコードの内容を変更しました。

2016/07/20 13:15

投稿

tomopichan2002
tomopichan2002

スコア17

title CHANGED
File without changes
body CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  int main(void){
15
15
 
16
- unsigned power(unsigned a,b,result);//power関数の宣言
16
+ unsigned power(unsigned a,b);//power関数の宣言
17
17
 
18
18
  //a^b-cの結果をresultとします。
19
19
 
@@ -24,7 +24,7 @@
24
24
 
25
25
  for(a=a;a<=100;a++){//変数aを変化させるためのfor文です。
26
26
 
27
- unsigned i = power(a,b,result);
27
+ unsigned i = power(a,b);
28
28
  result = i - c;//power関数の呼び出し resultの計算
29
29
  printf("%d",result);
30
30
 
@@ -79,8 +79,10 @@
79
79
 
80
80
  //power関数の定義 pow関数はdouble型なのでint型のpower関数を作りました。
81
81
 
82
- unsigned power(unsigned a,b,result){
82
+ unsigned power(unsigned a,b){
83
83
 
84
+ unsigned result;
85
+
84
86
  if(b==1){
85
87
 
86
88
  result = a;

1

ソースコードを'''で囲いました。

2016/07/20 10:12

投稿

tomopichan2002
tomopichan2002

スコア17

title CHANGED
@@ -1,1 +1,1 @@
1
- c言語
1
+ C言語で素数を判定したい
body CHANGED
@@ -7,8 +7,9 @@
7
7
  あと、type specifier missing.defaults to 'int'と警告文がでるのですがどうすれば解消されますか。
8
8
  アドバイスをいただけると嬉しいです。
9
9
 
10
+ ```c
10
- ---#include <stdio.h>
11
+ #include <stdio.h>
11
- ---#include <math.h>
12
+ #include <math.h>
12
13
 
13
14
  int main(void){
14
15
 
@@ -106,4 +107,5 @@
106
107
 
107
108
  return result;
108
109
 
109
- }
110
+ }
111
+ ```