Pythonで正負の数 （減法）の問題を自動作成する方法

Pythonで正負の数 （**減法**）の問題を自動作成する方法を紹介します。

※問題だけ欲しい人は、GitHubのWikiにあるサンプル問題をご覧ください。

https://github.com/AkibaBurari/math/wiki/seif-genpo

## 準備 1

あらかじめ、問題作成のための**基本**をおさえておいてください。こちらのページにまとめてあります。

https://qiita.com/akiba_burari/items/f8a11cf0533b889e0af3

## 準備 2

あらかじめ、正負の数 （**加法**）の問題を自動作成する方法をマスターしておいてください。こちらのページにまとめてあります。

https://qiita.com/akiba_burari/items/777dec85e9fcd59d1f49

## 作り方

すでに作成してあった加法のコード内の「+」の部分を「-」に変えるだけで、ある程度 問題が作成されます。

細かい部分はそのつど修正していきます。

## 減法（一桁）の問題を作る

まずは最も基本的な減法（一桁）の式を作ってみましょう。

中学1年の数学で扱われるのは次のような問題です。

例
**(+5)-(+7)**
**(-6)-(-2)**

**(+2)-(-5)**
**(-2)-(+9)**

これを、前回までの基本をふまえてコードを書くとこのようになります。

※以下、Pythonのコードになります。

```
import random

a=random.randint(0,9)
b=random.randint(0,9)

o=random.randint(0,9)
p=random.randint(0,9)
q=random.randint(0,9)
r=random.randint(0,9)
s=random.randint(0,9)
t=random.randint(0,9)

c="+"
d="-"

e="("
f=")"

print(e,c,str(a),f,"-",e,c,str(b),f)
print(e,d,str(o),f,"-",e,d,str(p),f)
print(e,c,str(q),f,"-",e,d,str(r),f)
print(e,d,str(s),f,"-",e,c,str(t),f)

#出力結果
#( + 9 ) - ( + 5 )
#( - 3 ) - ( - 0 )
#( + 4 ) - ( - 2 )
#( - 2 ) - ( + 1 )
```

## 注意点

**( - 3 ) - ( - 0 )**

**( + 0 ) - ( + 9 )**

上の例のようにゼロに「-」（マイナス）、あるいは「+」（プラス）の符号がついてしまうことがあります。

ゼロにはプラスでもマイナスでもないので、本来、「+」や「-」の符号は必要ありません。

出力結果からゼロについている符号（括弧を含む）を削除しましょう。

( - 3 ) - 0
0 - ( + 9)





## 減法（二桁）の問題を作る

加法のときと同じように、random.randintの引数の値を「9」から「99」変えるだけですが、

ごくまれに「+0」、「-0」が出力されるので注意が必要です。

ゼロが出力されたら、余計な符号を削除しましょう。

```
import random

a=random.randint(0,99)
b=random.randint(0,99)

o=random.randint(0,99)
p=random.randint(0,99)
q=random.randint(0,99)
r=random.randint(0,99)
s=random.randint(0,99)
t=random.randint(0,99)

c="+"
d="-"

e="("
f=")"

print(e,c,str(a),f,"-",e,c,str(b),f)
print(e,d,str(o),f,"-",e,d,str(p),f)
print(e,c,str(q),f,"-",e,d,str(r),f)
print(e,d,str(s),f,"-",e,c,str(t),f)

#出力結果
#( + 93 ) - ( + 8 )
#( - 60 ) - ( - 38 )
#( + 18 ) - ( - 95 )
#( - 24 ) - ( + 7 )
```



## 減法（小数）の問題を作る

加法のときに作ったコードをもとに、「+」を「-」に変えてあげます。

すでにroundを使い、小数点の位置を調整してあるので、細かく調整する必要はありません。

```
import random

a=random.uniform(0.1,9.9)
b=random.uniform(0.1,9.9)

o=random.uniform(0.1,9.9)
p=random.uniform(0.1,9.9)
q=random.uniform(0.1,9.9)
r=random.uniform(0.1,9.9)
s=random.uniform(0.1,9.9)
t=random.uniform(0.1,9.9)

c="+"
d="-"

e="("
f=")"

print(e,c,round(a, 1),f,"-",e,c,round(b, 1),f)
print(e,d,round(o, 1),f,"-",e,d,round(p, 1),f)
print(e,c,round(q, 1),f,"-",e,d,round(r, 1),f)
print(e,d,round(s, 1),f,"-",e,c,round(t, 1),f)

#出力結果
#( + 5.1 ) - ( + 4.0 )
#( - 9.6 ) - ( - 5.7 )
#( + 5.1 ) - ( - 2.5 )
#( - 3.7 ) - ( + 0.2 )
```


## 減法（分数）の問題を作る

まずは2つの分数を作ります。

```
import random

a=random.randint(1,9)
b=random.randint(1,9)

c=random.randint(1,9)
d=random.randint(1,9)

e="{"
f="}"

e1="\\biggl("
e2="\\biggr)"

h="+\\frac"
i="-\\frac"

print(e1,h,e,a,f,e,b,f,e2)
print(e1,i,e,c,f,e,d,f,e2)



#出力結果
#\biggl( +\frac { 3 } { 4 } \biggr)
#\biggl( -\frac { 7 } { 7 } \biggr)
```

$$
\biggl( +\frac { 3 } { 4 } \biggr)
$$

$$
\biggl( -\frac { 7 } { 7 } \biggr)
$$


この２つの分数を組み合わせて問題を作っていきます。


```
import random

a=random.randint(1,9)
b=random.randint(1,9)

c=random.randint(1,9)
d=random.randint(1,9)

e="{"
f="}"

e1="\\biggl("
e2="\\biggr)"

h="+\\frac"
i="-\\frac"

print(e1,h,e,a,f,e,b,f,e2,"-",e1,h,e,c,f,e,d,f,e2)
print(e1,h,e,a,f,e,b,f,e2,"-",e1,i,e,c,f,e,d,f,e2)
print(e1,i,e,a,f,e,b,f,e2,"-",e1,i,e,c,f,e,d,f,e2)
print(e1,i,e,a,f,e,b,f,e2,"-",e1,h,e,c,f,e,d,f,e2)


#出力結果
#\biggl( +\frac { 1 } { 8 } \biggr) - \biggl( +\frac { 5 } { 8 } \biggr)
#\biggl( +\frac { 1 } { 8 } \biggr) - \biggl( -\frac { 5 } { 8 } \biggr)
#\biggl( -\frac { 1 } { 8 } \biggr) - \biggl( -\frac { 5 } { 8 } \biggr)
#\biggl( -\frac { 1 } { 8 } \biggr) - \biggl( +\frac { 5 } { 8 } \biggr)
```
$$
\biggl( +\frac { 1 } { 8 } \biggr) - \biggl( +\frac { 5 } { 8 } \biggr)
$$

$$
\biggl( +\frac { 1 } { 8 } \biggr) - \biggl( -\frac { 5 } { 8 } \biggr)
$$

$$
\biggl( -\frac { 1 } { 8 } \biggr) - \biggl( -\frac { 5 } { 8 } \biggr)
$$

$$
\biggl( -\frac { 1 } { 8 } \biggr) - \biggl( +\frac { 5 } { 8 } \biggr)
$$


後は、変数を増やして数字がかぶらないようにするだけで問題が出来上がります。

```
import random

a=random.randint(1,9)
b=random.randint(1,9)

c=random.randint(1,9)
d=random.randint(1,9)

g=random.randint(1,9)
j=random.randint(1,9)
k=random.randint(1,9)
z=random.randint(1,9)

p=random.randint(1,9)
q=random.randint(1,9)
r=random.randint(1,9)
s=random.randint(1,9)

t=random.randint(1,9)
u=random.randint(1,9)
v=random.randint(1,9)
w=random.randint(1,9)

e="{"
f="}"

e1="\\biggl("
e2="\\biggr)"

h="+\\frac"
i="-\\frac"

print(e1,h,e,a,f,e,b,f,e2,"-",e1,h,e,c,f,e,d,f,e2)
print(e1,h,e,g,f,e,z,f,e2,"-",e1,i,e,j,f,e,k,f,e2)
print(e1,i,e,p,f,e,q,f,e2,"-",e1,i,e,r,f,e,s,f,e2)
print(e1,i,e,t,f,e,u,f,e2,"-",e1,h,e,v,f,e,w,f,e2)


#出力結果
#\biggl( +\frac { 8 } { 6 } \biggr) - \biggl( +\frac { 6 } { 9 } \biggr)
#\biggl( +\frac { 1 } { 1 } \biggr) - \biggl( -\frac { 8 } { 9 } \biggr)
#\biggl( -\frac { 9 } { 6 } \biggr) - \biggl( -\frac { 6 } { 1 } \biggr)
#\biggl( -\frac { 3 } { 7 } \biggr) - \biggl( +\frac { 8 } { 2 } \biggr)
```
$$
\biggl( +\frac { 8 } { 6 } \biggr) - \biggl( +\frac { 6 } { 9 } \biggr)
$$

$$
\biggl( +\frac { 1 } { 1 } \biggr) - \biggl( -\frac { 8 } { 9 } \biggr)
$$

$$
\biggl( -\frac { 9 } { 6 } \biggr) - \biggl( -\frac { 6 } { 1 } \biggr)
$$

$$
\biggl( -\frac { 3 } { 7 } \biggr) - \biggl( +\frac { 8 } { 2 } \biggr)
$$


## 問題のサンプル

GitHubのWikiに作成したサンプル問題を掲載しています。参考にしてください。

https://github.com/AkibaBurari/math/wiki/seif-genpo

## 最後に

今回はPythonで正負の数 「**減法**」の問題を自動作成する方法を紹介しました。

中学の1年で習う内容をもとに問題を作成しましたが、同じ方法を使えば、入試問題レベルの問題も作成できます。

数や引数の値を変えて自分でいろいろと試してみてください。

次回は「**減法と加法の混じった計算**」を取り上げる予定です。

## 関連記事

https://qiita.com/akiba_burari/items/f8a11cf0533b889e0af3

https://qiita.com/akiba_burari/items/777dec85e9fcd59d1f49

https://qiita.com/akiba_burari/items/954f832b408fef353aa3

https://qiita.com/akiba_burari/items/d185a2224c7bb87e5cdf

https://qiita.com/akiba_burari/items/55ddae0c065fdccdef16

https://qiita.com/akiba_burari/items/5bb4c083b30768a33aa1