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

回答編集履歴

1

コードの修正

2018/08/22 22:40

投稿

退会済みユーザー
answer CHANGED
@@ -2,30 +2,30 @@
2
2
  すなわち処理速度を上げる鍵だと思います。結論から言うと,aは奇数bは3以上の素数となります。
3
3
  理由を以下自分なりにまとめました。
4
4
  ![イメージ説明](5fe71218caba3e7367508c2f17bb1006.png)
5
-
5
+ ~~
6
6
  また、f(n) = n ^ 2 + an + bが f(n) = (n + i)(n + j)のように因数分解できる形だと素数にならないので2次方程式の解と係数の関係を使ってa,bの取りうる値をさらに絞り込みました。
7
- (結果的にこれがなくても求められましたが、処理速度は上がると思います...)
7
+ (結果的にこれがなくても求められましたが、処理速度は上がると思います...)~~
8
8
  ごれを踏まえ、以下のようなメソッドを用意しました。
9
9
  - 素数かどうか判定するメソッド
10
10
  - n ^ 2 + an + bを出力するメソッド
11
- - f(n)が因数分解されるかどうか判定するメソッド
11
+ ~~- f(n)が因数分解されるかどうか判定するメソッド~~
12
12
  - 求める長さを求めるメソッド (while文を使って合成数になった瞬間打ち切ればOK!!)
13
13
 
14
14
  ```java
15
+
15
16
  public class Main {
17
+
16
18
  public static void main(String[] args){
17
-
19
+
18
20
  int []max_data = new int[3];
19
21
  String []text = {"a","b","length"};
20
-
22
+
21
23
  for(int a = 999; a >= -999; a -= 2){
22
- for(int b = 999; b >= 0; b -= 2){
24
+ for(int b = 999; b >= 3; b -= 2){
23
- if(check_func(a,b) && is_prime(b)){
24
- if(is_length(a,b) > max_data[2]){
25
+ if(is_length(a,b) > max_data[2]){
25
- max_data[2] = is_length(a,b);
26
+ max_data[2] = is_length(a,b);
26
- max_data[0] = a;
27
+ max_data[0] = a;
27
- max_data[1] = b;
28
+ max_data[1] = b;
28
- }
29
29
  }
30
30
  }
31
31
  }
@@ -34,10 +34,13 @@
34
34
  }
35
35
  int answer = max_data[0] * max_data[1];
36
36
  System.out.println("積は" + answer);
37
-
37
+
38
38
  }
39
39
  public static boolean is_prime(int n)
40
40
  {
41
+ if(n <= 1){
42
+ return false;
43
+ }
41
44
  for(int i = 2; i <= (int)Math.sqrt(n); i++){
42
45
  if(n % i == 0){
43
46
  return false;
@@ -49,17 +52,9 @@
49
52
  {
50
53
  return n * n + a * n + b;
51
54
  }
52
- public static boolean check_func(int a, int b)
55
+
53
- {
54
- for(int i = 1; i <= b; i++){
55
- if(i + b / i == a){
56
- return false;
57
- }
58
- }
59
- return true;
60
- }
61
56
  public static int is_length(int a, int b){
62
-
57
+
63
58
  int length = 0;
64
59
  int n = -1;
65
60
  while(is_prime(func(a,b,++n))){
@@ -67,8 +62,10 @@
67
62
  }
68
63
  return length;
69
64
  }
65
+
66
+
70
67
  }
71
68
 
72
69
  ```
73
70
  <実行結果>
74
- a = -999 b = 61 length = 1011 積は-60939
71
+ a = -61 b = 971 length = 71 積は-59231