1. No Profile Picture
Registered User
Devshed Newbie (0 - 499 posts)

Join Date
Mar 2013
Posts
6
Rep Power
0

#### Python Program-Happy 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.
2. 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: ')
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)```