I wrote this program for school (first year in college) and it works, but it's too slow. I wondered if anyone could help me optimize this a bit, because I've been trying and trying, but it just won't get better.
If I choose a lower limit of 5000 and an upper limit of 10000 it my program 10 times longer than my professors code (I did not see his code).
This is for school, but I won't get a grade for this; I'm not even obligated to make it. I just really want to improve.
def askLowerLimit():
lowerLimit = int(input())
while lowerLimit <= 0:
print()
lowerLimit = int(input())
return lowerLimit
def askUpperLimit(lowerLimit):
upperLimit = int(input())
while upperLimit < lowerLimit:
print()
upperLimit = int(input())
return upperLimit
def amountOddDivisorsOf(number):
amountOddDivisors = 1
divisor = 2
if number % 2 != 0:
divisor = 3
for i in range(3, number//divisor +1, 2):
if number % i == 0:
amountOddDivisors += 1
return amountOddDivisors
def numberWithMostOddDivisors(lowerLimit, upperLimit):
numberWithMostDivisors = lowerLimit
amountOfNumberWithMostDivisors = amountOddDivisorsOf(numberWithMostDivisors)
for x in range(lowerLimit + 1, upperLimit + 1):
amountOfCurrentNumber = amountOddDivisorsOf(x)
if amountOfCurrentNumber > amountOfNumberWithMostDivisors:
numberWithMostDivisors = x
amountOfNumberWithMostDivisors = amountOfCurrentNumber
return numberWithMostDivisors
def biggestAmmountOddDivisorsInInterval():
lowerLimit = askLowerLimit()
upperLimit = askUpperLimit(lowerLimit)
numberWithMostD = numberWithMostOddDivisors(lowerLimit, upperLimit)
amountOfOddDivisorsOfNumber = amountOddDivisorsOf(numberWithMostD)
print("Number with most odd divisors in interval [{0} {1}] is {2}:".format(lowerLimit, upperLimit, numberWithMostD))
print("{0} has {1} odd divisors!".format(numberWithMostD, amountOfOddDivisorsOfNumber))
biggestAmmountOddDivisorsInInterval()
The problem should be somewhere in amountOddDivisorsOf(number)
or numberWithMostOddDivisors(lowerLimit, upperLimit)
.