我刚开始学习Python并且正在尝试做练习。
我觉得我错过了一些非常基本的东西,因为我无法获得一些返回来影响我的代码的值。
以下代码的要点是打印用户输入分数的素因子,除了它只打印输入的分数的素因子而不是简化的分数。
def gcd(a,b):
while b:
a,b = b,a%b
return a
def simplify_fraction(numerator,denominator):
cd = gcd(numerator,denominator)
(simple_num,simple_denom) = (numerator/cd,denominator/cd)
if simple_denom == 1:
return simple_num
elif cd == 1:
return simple_num,simple_denom
else:
return simple_num,simple_denom
def prime_factors(n):
i = 2
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors
while True:
try:
while True:
fraction = input("Input a positive fraction then press enter:")
numerator,denominator = fraction.split("/")
numerator = int(numerator)
denominator = int(denominator)
if denominator == 0:
raise ValueError
elif numerator < 0:
print("That is not a positive fraction, please try again.")
continue
elif denominator < 0:
print("That is not a positive fraction, please try again.")
continue
elif numerator == 0:
print(str(numerator) + " / " + str(denominator) + " -> [0]")
elif numerator == 1:
print(str(fraction) + " -> [1] / " + str(prime_factors(denominator)))
elif int(denominator) == 1:
print(str(fraction) + " -> " + str(prime_factors(numerator)))
else:
simplify_fraction(numerator,denominator)
我确定我在这里遗漏了一些东西,将我的simplify_fraction函数链接到我的代码块但我无法弄清楚它是什么。
print(str(fraction) + " -> " + str(prime_factors(numerator)) + " / " + str(prime_factors(denominator)))
while True:
character = str(input('Continue (y/n)? '))
if character == "y":
break
if character == "n":
quit()
else:
print ("That was not a valid choice, please select (y/n).")
continue
except ValueError:
print("That is not a fraction, please try again.")
continue
以下是两个例子:
3/9的输入给出3/9 - &gt; [3] / [3,3]。我希望它是3/9 - &gt; [1] / [3]。
输入138/24给出138/24 - &gt; [2,3,23] / [2,2,2,3]。我希望它是138/24 - &gt; [23] / [2,2]
有人可以就此给我一些建议吗?
答案 0 :(得分:1)
在过去的几个小时里尝试了几种方法来实现这一目标并将其排序。 感觉我已经回答了这个,因为它现在没有实际意义...... 这是完成的代码:
def gcd(a,b):
while b:
a,b = b,a%b
return a
def simplify_fraction(numerator,denominator):
cd = gcd(numerator,denominator)
(simple_num,simple_denom) = (numerator/cd,denominator/cd)
return int(simple_num),int(simple_denom)
def prime_factors(n):
i = 2
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors
while True:
try:
while True:
fraction = input("Input a positive fraction then press enter:")
numerator,denominator = fraction.split("/")
numerator = int(numerator)
denominator = int(denominator)
if denominator == 0:
raise ValueError
elif numerator < 0:
print("That is not a positive fraction, please try again.")
continue
elif denominator < 0:
print("That is not a positive fraction, please try again.")
continue
simple_num,simple_denom = simplify_fraction(numerator,denominator)
if simple_denom == 1 and simple_num == 0:
print(str(fraction) + " -> [0]")
elif simple_denom == 1:
print(str(fraction) + " -> " + str(prime_factors(simple_num)))
elif simple_num == 1:
print(str(fraction) + " -> [1] / " + str(prime_factors(simple_denom)))
else:
print(str(fraction) + " -> " + str(prime_factors(simple_num)) + " / " + str(prime_factors(simple_denom)))
while True:
character = str(input('Continue (y/n)? '))
if character == "y":
break
if character == "n":
quit()
else:
print ("That was not a valid choice, please select (y/n).")
continue
except ValueError:
print("That is not a valid fraction, please try again.")
continue
这是对该计划的测试:
输入正分数然后按enter:-6/2
这不是一个积极的部分,请再试一次
输入正分数然后按Enter:6 / -2
这不是一个积极的部分,请再试一次
输入正分数,然后按enter键:10/0
这不是一个有效的部分,请再试一次
输入正分数然后按enter:0/0
这不是一个有效的部分,请再试一次
输入正分数然后按Enter:0/10
0/10 - &gt; [0]
继续(是/否)? ÿ
输入正分数,然后按enter键:138/24
138/24 - &gt; [23] / [2,2]
继续(是/否)? ÿ
输入正分数,然后按enter:24/138
24/138 - &gt; [2,2] / [23]
继续(是/否)? ü
这不是一个有效的选择,请选择(y / n)
继续(是/否)? TT
这不是一个有效的选择,请选择(y / n)
继续(是/否)? ÿ
这不是一个有效的选择,请选择(y / n)
继续(是/否)? ÿ
输入正分数,然后按Enter键:66
这不是一个有效的部分,请再试一次
输入正分数,然后按enter键:1024/512
1024/512 - &gt; [2]
继续(是/否)? ÿ
输入正分数,然后按enter键:1024/511
1024/511 = [2,2,2,2,2,2,2,2,2,2] / [7,73]
继续(是/否)? n
程序退出。
我的主要错误是没有在我的主代码块中设置变量simple_num和simple_denom ....知道它是基本的东西。一旦完成,只需要进行调整以使其完美。
哇,真是个咆哮。对于那个很抱歉。如果有人看到它并知道更好的方法,我很乐意看到它...总是试图改进。
感谢这个很棒的网站和社区!