April 1st, 2013, 05:19 PM

Python ProgramHappy numbers
Need help with this problem. Note: I have to use loops and nothing ahead. I dont understand where I would start and how I would do it
There is a sequence obtained by summing the squares of the digits of a
number repeatedly. If the sequence converges to 1 in fewer than 15 steps,
this number is considered a happy number.
A perfect number is a positive integer that is equal to the sum of its proper
positive divisors (i.e. the sum of its positive divisors excluding the
number itself).
e.g. 6 is a perfect number because 1+2+3=6.
A number is practical if it is neither happy nor perfect.
Level 3: Make a program that allows the user to enter a number and it will tell them if the
number entered is a happy number or not. The user should be able to keep entering numbers
until 1 is entered to quit the program.
Level 4: In addition to telling the user whether the number is happy, tell them if the number
is perfect and if the number is practical.
April 1st, 2013, 07:45 PM

This program might help. You'd have to modify it a lot to submit for a grade. In the process you might learn some python. Before scrolling down, break your problem into small steps.
1) Write a program that prompts for input and displays it. Run the program.
2) On paper, write the steps you'd use to determine if a number is happy. Now translate your algorithm to python. Python doesn't work like a human brain. Where you recognize a symbol as both a digit character and a numeric value, python won't. (gawk treats values as numbers or strings depending on context. Very nice!) How can convert a number to it's digits? How do you square them? How will you sum these squares?
3) Do likewise for perfect numbers. How will you find all the divisors of a number? What python functions or operators will be useful?
spoiler
Code:
import sys
from math import sqrt
def happy(a):
b = str(a)
for i in range(16):
b = sum(int(c)**2 for c in b)
if b == 1:
return True
b = str(b)
return False
def perfect(a):
if a < 1:
return False
sum_of_divisors = 1
for trial_divisor in range(2, 1 + int(sqrt(a))):
(quotient, remainder,) = divmod(a, trial_divisor)
if not remainder:
sum_of_divisors += trial_divisor + quotient
return sum_of_divisors == a
def classify(a):
return 'practical,happy,perfect,perfectly happy'.split(',')[perfect(a)*2 + happy(a)]
def main():
sys.stdout.write('Enter a positive integer: ')
a = sys.stdin.readline()
try:
b = int(a)
except:
print('Next time, enter an integer')
sys.exit(1)
if b < 1:
print('Next time, enter a positive integer')
sys.exit(1)
print(classify(b))
if __name__ == '__main__':
main()
else:
for i in range(99999):
if 'perfectly' in classify(i):
print(i)
[code]
Code tags[/code] are essential for python code and Makefiles!