回答編集履歴

3

d

2019/12/20 14:14

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -118,7 +118,7 @@
118
118
 
119
119
 
120
120
 
121
- for c1, c2 in combinations_with_replacement(range(0, N + 1), 2):
121
+ for c1, c2 in combinations_with_replacement(range(N + 1), 2):
122
122
 
123
123
  a = c1
124
124
 

2

d

2019/12/20 14:13

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -93,3 +93,41 @@
93
93
  print(check(1200, 33, 1, 1234))
94
94
 
95
95
  ```
96
+
97
+
98
+
99
+ ## 追記
100
+
101
+
102
+
103
+ > a,b,cがゼロも含めてよい(0以上の整数)場合ならばどうなりますかね?
104
+
105
+
106
+
107
+ 0以上の整数の場合も同様に仕切りをどこに入れるかの組み合わせを考える問題になります。0が許されるので、左端、右端に仕切りを入れる、同じ場所に2枚仕切りを入れることも許されるようになるという違いはありますが、基本は同じです。
108
+
109
+
110
+
111
+ ```python
112
+
113
+ from itertools import combinations_with_replacement
114
+
115
+
116
+
117
+ N = 20
118
+
119
+
120
+
121
+ for c1, c2 in combinations_with_replacement(range(0, N + 1), 2):
122
+
123
+ a = c1
124
+
125
+ b = c2 - c1
126
+
127
+ c = N - c2
128
+
129
+ assert a + b + c == N
130
+
131
+ print(f"a = {a}, b = {b}, c = {c}")
132
+
133
+ ```

1

d

2019/12/20 14:13

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -55,3 +55,41 @@
55
55
 
56
56
 
57
57
  a + b + c = 1234 の組み合わせ数は Comb(1233, 2) = 759528 です。
58
+
59
+
60
+
61
+ ## 追記
62
+
63
+
64
+
65
+ 組み合わせ数を列挙するプログラムは上のものでよいですが、
66
+
67
+ a + b + c = N; a, b, c は正の整数という条件かどうかの判定をしたいのであれば、以下でできます。
68
+
69
+
70
+
71
+ ```python
72
+
73
+ def check(a, b, c, N):
74
+
75
+ # すべて整数かどうか
76
+
77
+ all_integer = isinstance(a, int) and isinstance(b, int) and isinstance(c, int)
78
+
79
+ # すべて0より大きい (正の整数) かどうか
80
+
81
+ all_positive = a > 0 and b > 0 and c > 0
82
+
83
+ # 合計が N となるかどうか
84
+
85
+ equals_to_N = a + b + c == N
86
+
87
+
88
+
89
+ return all_integer and all_positive and equals_to_N
90
+
91
+
92
+
93
+ print(check(1200, 33, 1, 1234))
94
+
95
+ ```