用python写因式分解程序(一)
近段时间被微信上漫天飞舞的广告怂恿,学起了python编程,这些天找了一个小题目开整:因式分解
总体实现过程设计:
第一阶段:先满足实现既定的功能
第二阶段:优化程序,提高计算速度
第三阶段:python程序写好了,但没有界面总是不舒服,那就借助VB6编写一个界面,后台调用python的运算程序,让用户输入一个数据按Enter键后就能显示结果,这就是VB6+python的结合编程
大概的要求是这样的:由用户任何输入一个>=2的正整数后,程序得到这个数的因式分解的表达式,比如:
10 = 2*5
205 = 5*41
786 =3*3*3*29
1573 =11*11*13
57894=2*3*9649
从以上例子可以看出,一个正整数分解后的各个因子必定全部都是质数,所以得先找到质数因子。
将这个任务分成四个步骤处理:
1.找到质数列表:先找到输入正整数所在范围内的所有质数(质数就是只能被1和本身整除的大于等于2的正整数,最小的质数是2),并存到一个列表中
2.找到输入数的分解因子:采用循环遍历方式,将输入数与质数列表中的质数一一相除,能整除的质数,就是要找的质数因子,将找到的质数因子存到新的列表中
3.找到因子的个数:第二步中找到了分解的因子,但因子的个数不能确定,比如786的分解因子是3和29,但由几个3和几个29相乘,必须找出来,再一次用输入数与因子作整除,用新列表记录能整除的次数,就是几个因子相乘
4.验算结果是否正确:将所有因子相乘(当然要包含相乘个数),检验乘积是否与输入数相符
5.显示因式分解的表达式:有了因子,有了因子的个数,就可以得到分解的表达式,右边是全部相乘的方式
按以上的方式进行程序的编写:
# python_fenjieV0
# 查找用户指定的正整数范围内有哪些是质数,并对其进行因式分解
#找出指定数据范围内的所有质数 并找到分解因子的函数susu()
def susu(int_shuju):
# 1.找出质数
zhisu = []
for num in range(2, int_shuju+1):
for i in range(2, num):
if num % i == 0:
break
else:
zhisu.append(num)
print('1到{0}范围内的质数共有{1}个'.format(int_shuju, len(zhisu)))
print('找到的1-{0}范围内的质数如下:'.format(int_shuju))
print(zhisu)
# 2.寻找因子
fenjie= []
len_zhisu = len(zhisu)
for m in range(len_zhisu):
if int_shuju % zhisu[m] == 0:
fenjie.append(zhisu[m])
return fenjie
# 找出各个分解因子的个数函数guoshu()
def guoshu(int_num, i):
pcs = 0 # 记个数
flag = 1 # 标记
while(flag ==1): # 不知道循环次数要用while
if int_num%aa[i] == 0:
int_num = int(int_num/aa[i])
pcs =pcs + 1
flag = 1
else:
flag = 0
return pcs
key = 0
while(key == 0):
# 用户指定一个数
int_num = input('请输入一个正整数(>=2):')
# 去除输入字符串首尾的空格
int_num = int_num.strip()
# 先进行判断输入的字符串是不是数字型的
if int_num.isdigit() == False:
print('你的输入有误,请输入>=2的正整数!')
key= 0
# 如果是数字型的字符串,就转成整数型
# int()会转成整数型,就算输入的是float型会直接删去小数部分
else:
int_num = int(int_num)
if int_num<2: # 输入的数必须>=2
print('你的输入有误,请输入>=2的正整数!')
key=0
else:
key=1
break
print()
print('***1.找出指定范围内所有的质数***')
# 调用函数找到所有质数 并找到数据的所有的分解因子
aa = susu(int_num)
print()
print('***2.列出指定数据的所有因子***')
print('数字{}分解的因子为:'.format(int_num))
# 显示所有的分解因子
print(aa)
print()
print('***3.确定上述因子的个数***')
# 用列表记录各个因子的个数,先定义为空
list_guoshu = []
# 列表aa的长度
len_aa = len(aa)
for i in range(len_aa):
# 调用函数找出各个因子的个数
bb = guoshu(int_num, i)
# 找到的个数加入列表中
list_guoshu.append(bb)
# 显示列表中存储的个数
print(list_guoshu)
print()
# 验算分解的结果是否无误
print('***4.验算分解的结果***')
total = 1
for i in range(len_aa):
total = total * aa[i]**list_guoshu[i]
print('分解因子的乘积为{}'.format(total))
if (int_num == total):
print('数字{0}分解无误!'.format(int_num))
else:
print('数字{0}分解有误!'.format(int_num))
print()
# 按常规格式显示分解的结果,用字符串的方法作显示
print('***5.显示分解的结果***')
str_aa = ''
str_pow ='^'
str_ch =' * '
str_list_guoshu = ''
str_result = ''
for i in range(len_aa):
str_aa = str(aa[i])
str_list_guoshu = str(list_guoshu[i])
if i ==0:
str_result =str_result + str_aa + str_pow + str_list_guoshu
else:
str_result =str_result + str_ch + str_aa + str_pow + str_list_guoshu
print('分解表达式: {0} = {1}'.format(int_num, str_result ))
说明:^表示幂运算
功能虽然实现了,但对于输入的数据在2万以上就出现明显等待,运算太慢,
以上程序还得进行优化,以提高速度才行,那就留到下一次继续吧。