def gei(a, b):
'''
a, b: only positive integers! If you don't, we will make you. Max 1337
For extracting the juice of the numbers in the form of a common divider
'''
#Not Ruby, no to_i, but int()
smallest = int(abs(min(a, b)))
biggest = int(abs(max(a, b)))
print "You inputed: ", smallest, " and ", biggest, " their order doesn't matter."
print "Do you want to see guess numbers? Type 'yes', if you do! "
selection = raw_input()
print
print
#To evade infinite loops and too big numbers, we use count.
count = 0
ans = smallest
truth = str(selection) == str('yes')
def condition(ans, base):
ans1 = base % ans == 0
return ans1
while condition(ans, biggest) == False or condition(ans, smallest) == False:
ans -= 1
count += 1
if count >= 1337:
break
elif truth == True:
print ans
if truth == True:
print
print
print "After weeks of calculation, here is your greater common divider: "
return ans
所以是的,8年级的信息学任务,以提取共同更大的分隔线。我想知道,也许你们知道我怎么能减少它的麻烦?如何避免在里面使用定义并命名这么多变量?
答案 0 :(得分:8)
import fractions
print fractions.gcd(4,8)
>>> 4
但您也可以查看来源:
def gcd(a, b):
"""Calculate the Greatest Common Divisor of a and b.
Unless b==0, the result will have the same sign as b (so that when
b is divided by it, the result comes out positive).
"""
while b:
a, b = b, a%b
return a
答案 1 :(得分:1)
使用欧几里德的算法
int GCD(int a,int b){
if(b==0){
return a;
}
return GCD(b,a%b);
}
答案 2 :(得分:0)
您的代码可以改进一些事项。
首先,truth
是一个真正糟糕的变量名,因为它并没有真正告诉你它的内容是什么意思。我会使用类似show_work
的内容。
接下来,您有一个内部函数,它告诉您一个变量均匀地划分另一个变量(返回一个布尔值)。我建议直接使用模数值,而不是将其转换为带有== 0
的bool,并且您也不需要它在函数中。此外,您无需将值与True
或False
进行比较。只需使用值本身(或使用not
将其反转)。将这些放在一起会使while
循环的条件not biggest % ans and not smallest % ans
。
最后,您可以使用比逐个尝试每个值更好的算法。 Euclid's algorithm是一种快速计算最大公约数的好方法,并且在Python中很容易实现(但我会留给你)。
答案 3 :(得分:-1)
这很好用,并且没有变量:
def gcd(a,b):
return max(d for d in xrange(1, min(a, b)+1) if a % d == b % d == 0)
print gcd(15, 25)
>>> 5
但请不要声称它是您自己的:)