質問編集履歴
5
誤字の訂正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
和が7の倍数となる3つの数字の組み合わせを効率よく数えたいです。
|
test
CHANGED
File without changes
|
4
ソースの訂正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
和が7の倍数となる3つの数字の組み合わせを効率よく数えたいです。
|
1
|
+
so和が7の倍数となる3つの数字の組み合わせを効率よく数えたいです。
|
test
CHANGED
@@ -8,9 +8,11 @@
|
|
8
8
|
|
9
9
|
### 私の現在のベストな考え
|
10
10
|
|
11
|
-
(I)2重for文を使って7で割ったときの余りがそれぞれいくつかあるか数えます。
|
11
|
+
(I)2重for文を使って**7で割ったときの**余りがそれぞれいくつかあるか数えます。
|
12
12
|
|
13
13
|
```Java
|
14
|
+
|
15
|
+
//受け取ったデータを7で割った余りに変換しました。
|
14
16
|
|
15
17
|
int []count = new int[7];
|
16
18
|
|
3
説明の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -58,92 +58,6 @@
|
|
58
58
|
|
59
59
|
どなたか、もっと効率の良い方法がありましたら、ご教授できないでしょうか?
|
60
60
|
|
61
|
+
もしかしたら、根本から変えるべきかもしれません。
|
62
|
+
|
61
63
|
よろしくお願い致します。
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
私が書いたソースコードを載せておきます。
|
66
|
-
|
67
|
-
```Java
|
68
|
-
|
69
|
-
import java.util.Scanner;
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
public class Sum {
|
74
|
-
|
75
|
-
public static void main(String[] args){
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
Scanner sc = new Scanner(System.in);
|
80
|
-
|
81
|
-
int n = sc.nextInt();
|
82
|
-
|
83
|
-
int[]data = new int[n];
|
84
|
-
|
85
|
-
for(int i = 0; i < n; i++){
|
86
|
-
|
87
|
-
int m = sc.nextInt();
|
88
|
-
|
89
|
-
data[i] = m;
|
90
|
-
|
91
|
-
}
|
92
|
-
|
93
|
-
int []count = new int[7];
|
94
|
-
|
95
|
-
for(int i = 0; i < data.length; i++){
|
96
|
-
|
97
|
-
for(int j = 0; j < 7; j++){
|
98
|
-
|
99
|
-
if(data[i] % 7== j){
|
100
|
-
|
101
|
-
count[j]++;
|
102
|
-
|
103
|
-
}
|
104
|
-
|
105
|
-
}
|
106
|
-
|
107
|
-
}
|
108
|
-
|
109
|
-
int [][]data2 = {{0,1,6},{0,2,5},{0,3,4},{1,2,4},{3,5,6}};
|
110
|
-
|
111
|
-
//int [][]data3 = {{1,1,5},{3,3,1},{2,2,3},{6,6,2},{4,4,6},{5,5,4}};
|
112
|
-
|
113
|
-
int sum = 0;
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
for(int i = 0; i < 5; i++){
|
118
|
-
|
119
|
-
int tmp = 1;
|
120
|
-
|
121
|
-
for(int j = 0; j < 3; j++){
|
122
|
-
|
123
|
-
tmp *= count[data2[i][j]];
|
124
|
-
|
125
|
-
}
|
126
|
-
|
127
|
-
sum += tmp;
|
128
|
-
|
129
|
-
}
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
for(int i = 0; i < 6; i++){
|
134
|
-
|
135
|
-
sum += count[i] * (count[i] - 1) * count[(14 - 2 * i) % 7] / 2;
|
136
|
-
|
137
|
-
}
|
138
|
-
|
139
|
-
sum += count[0] * (count[0] - 1) * (count[0] - 2) / 6;
|
140
|
-
|
141
|
-
System.out.println(sum);
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
}
|
146
|
-
|
147
|
-
}
|
148
|
-
|
149
|
-
```
|
2
ソースコードの追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -59,3 +59,91 @@
|
|
59
59
|
どなたか、もっと効率の良い方法がありましたら、ご教授できないでしょうか?
|
60
60
|
|
61
61
|
よろしくお願い致します。
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
私が書いたソースコードを載せておきます。
|
66
|
+
|
67
|
+
```Java
|
68
|
+
|
69
|
+
import java.util.Scanner;
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
public class Sum {
|
74
|
+
|
75
|
+
public static void main(String[] args){
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
Scanner sc = new Scanner(System.in);
|
80
|
+
|
81
|
+
int n = sc.nextInt();
|
82
|
+
|
83
|
+
int[]data = new int[n];
|
84
|
+
|
85
|
+
for(int i = 0; i < n; i++){
|
86
|
+
|
87
|
+
int m = sc.nextInt();
|
88
|
+
|
89
|
+
data[i] = m;
|
90
|
+
|
91
|
+
}
|
92
|
+
|
93
|
+
int []count = new int[7];
|
94
|
+
|
95
|
+
for(int i = 0; i < data.length; i++){
|
96
|
+
|
97
|
+
for(int j = 0; j < 7; j++){
|
98
|
+
|
99
|
+
if(data[i] % 7== j){
|
100
|
+
|
101
|
+
count[j]++;
|
102
|
+
|
103
|
+
}
|
104
|
+
|
105
|
+
}
|
106
|
+
|
107
|
+
}
|
108
|
+
|
109
|
+
int [][]data2 = {{0,1,6},{0,2,5},{0,3,4},{1,2,4},{3,5,6}};
|
110
|
+
|
111
|
+
//int [][]data3 = {{1,1,5},{3,3,1},{2,2,3},{6,6,2},{4,4,6},{5,5,4}};
|
112
|
+
|
113
|
+
int sum = 0;
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
for(int i = 0; i < 5; i++){
|
118
|
+
|
119
|
+
int tmp = 1;
|
120
|
+
|
121
|
+
for(int j = 0; j < 3; j++){
|
122
|
+
|
123
|
+
tmp *= count[data2[i][j]];
|
124
|
+
|
125
|
+
}
|
126
|
+
|
127
|
+
sum += tmp;
|
128
|
+
|
129
|
+
}
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
for(int i = 0; i < 6; i++){
|
134
|
+
|
135
|
+
sum += count[i] * (count[i] - 1) * count[(14 - 2 * i) % 7] / 2;
|
136
|
+
|
137
|
+
}
|
138
|
+
|
139
|
+
sum += count[0] * (count[0] - 1) * (count[0] - 2) / 6;
|
140
|
+
|
141
|
+
System.out.println(sum);
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
}
|
146
|
+
|
147
|
+
}
|
148
|
+
|
149
|
+
```
|
1
誤字の訂正
test
CHANGED
File without changes
|
test
CHANGED
@@ -54,7 +54,7 @@
|
|
54
54
|
|
55
55
|
特に最初、7で割ったときの余りをそれぞれ数えるところでデータの個数がN個の時
|
56
56
|
|
57
|
-
2重for文で N *
|
57
|
+
2重for文で N * 7回もループするのでループする回数を減らすことができたら、さらに効率よく求まると思いました。しかし、他の方法は全く思いつかず,これが今の精一杯です。
|
58
58
|
|
59
59
|
どなたか、もっと効率の良い方法がありましたら、ご教授できないでしょうか?
|
60
60
|
|