プログラミングを利用して因数分解できないか
※改善あればWelcomeですので、宜しくお願い致します。
勉強がてら自動因数分解装置を作ってみようと思い始めてみたが、ソースコードが美しくない。。。
ところどころ無理やり感満載ではあるが、中学基本数学レベルであれば因数分解できるソースは完成した。
因数定理から因数分解したほうが良いかもしれないが。おいおい分数が出ると困るので、地道にやるしかないのだろうか。
以下のソースコードを利用すれば、中学数学レベルであればコンピュータがやってくれるので、宿題がはかどるかも!?
おいおいは以下のような因数分解できるようになればなと思う。
STEP1はそんなに時間かからなそうではあるが、今日は疲れたので中学数学まで。
STEP1 : (a+c)x**2 + (ad+bc)x + bd = (ax+b)(cx+d)
STEP2 : 因数定理を活用した3次式の因数分解
STEP3:その他大学入試で出題されるレベルのものを網羅的に
以下のコードに入力値を渡せば因数分解の式が出力される。
【inputのルール】
①符号と式の間はスペースをあける
②1*x の場合は、通常は1を省略するが、1x と記載する
(例)
input
x**2 - 20x + 96
output
(x - 12)(x - 8)
input
x**2 - 9
output
(x + 3)(x - 3)
input
x**2 - 4x + 4
output
(x - 2)**2
import math
a = 0
b = 0
jud1 = "+"
jud2 = "+"
nums = input().split()
if len(nums) <= 3:
a = int(math.sqrt(int(nums[2])))
print("(x + " + str(a) + ")(x - " + str(a) + ")")
else:
if nums[3] == "-":
nums[4] = int(nums[4])*(-1)
li = list(nums[2].split("x"))
if nums[1] == "-":
li[0] = int(li[0])*(-1)
for i in range(-100,100):
if (i * (int(li[0]) - i)) == int(nums[4]):
a = i
b = int(li[0]) - i
if a < 0:
jud1 = "-"
if b < 0:
jud2 = "-"
if a == b:
print("(x " + jud1 , str(abs(a)) + ")**2")
else:
print("(X " + jud1 , str(abs(a)) + ")(x " + jud2 , str(abs(b)) + ")")
改善したいポイント
初学者が故に実は簡単な求め方があるかもしれないが、**各項の係数を簡単に取り出したい(できれば符号含め)**というのができればよりスマートに書けそうだなと思う。
また、x**2 - 9
のように項が2つしかないパターンを無理やり
if len(nums) <= 3:
a = int(math.sqrt(int(nums[2])))
print("(x + " + str(a) + ")(x - " + str(a) + ")")
としているところが一番気持ち悪い。
今のところは通過できているが、例えばおいおいx**3 - 8 みたいのが出たときに困るのでどうしたものかと考え中。