Very speciel function

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

Hi!

I want to check if a number is a happy number
a number number is like this
(sorry i can't write it correct with in 2 hope you understand)
Number is 19

1 in 2 + 9 in 2 = 82
8 in 2 + 2 in 2 = 68
6 in 2 + 8 in 2 = 100
1 in 2 + 0in 2 + 0in 2 = 1

This is not a Happy number
Number = 24

2in2 + 4in2 = 20
2in2 + 0in2 = 4

So only when the last ciffer is one it is a happy number

I can make it by using if and if and if...........................

But isn't there a easy way to do this?
Please help i can't see it..........

Best regards

Alvin
 
Hi,

Try this:

Function HappyNumber(num)
Dim n() As Integer
l = Len(num)
ReDim n(l)
newnum = 0
For i = 1 To l
newnum = newnum + CInt(Mid(num, i, 1)) ^ 2
Next i
HappyNumber = newnum
End Function


Sub test()
num = 24
snum = num
Do While num > 10
num = HappyNumber(num)
Loop
If num = 1 Then
MsgBox snum & " is a happy number"
Else
MsgBox snum & " is not a happy number"
End If
End Sub


HTH
 
Function IsHappy(num As Long, _
Optional flag As Boolean = True, _
Optional cnt As Long = 1)
Static orig As Long
Dim n1 As Long
Dim str As Long
Dim tot As Long
If flag Then
orig = 0
End If
If num <> 1 Then cnt = cnt + 1
tot = 0
sStr = CStr(num)
For i = 1 To Len(sStr)
n1 = CLng(Mid(sStr, i, 1))
tot = tot + n1 ^ 2
Next
If tot = 1 Then
IsHappy = True
ElseIf cnt > 30 Then
IsHappy = False
Else
If flag Then orig = tot
IsHappy = IsHappy(tot, False, cnt)
End If
End Function
 
Thank's Tom
its working

Regards
alvin


Tom Ogilvy said:
Function IsHappy(num As Long, _
Optional flag As Boolean = True, _
Optional cnt As Long = 1)
Static orig As Long
Dim n1 As Long
Dim str As Long
Dim tot As Long
If flag Then
orig = 0
End If
If num <> 1 Then cnt = cnt + 1
tot = 0
sStr = CStr(num)
For i = 1 To Len(sStr)
n1 = CLng(Mid(sStr, i, 1))
tot = tot + n1 ^ 2
Next
If tot = 1 Then
IsHappy = True
ElseIf cnt > 30 Then
IsHappy = False
Else
If flag Then orig = tot
IsHappy = IsHappy(tot, False, cnt)
End If
End Function
 
can i ask how this is executed?

--


Gary


Tom Ogilvy said:
Function IsHappy(num As Long, _
Optional flag As Boolean = True, _
Optional cnt As Long = 1)
Static orig As Long
Dim n1 As Long
Dim str As Long
Dim tot As Long
If flag Then
orig = 0
End If
If num <> 1 Then cnt = cnt + 1
tot = 0
sStr = CStr(num)
For i = 1 To Len(sStr)
n1 = CLng(Mid(sStr, i, 1))
tot = tot + n1 ^ 2
Next
If tot = 1 Then
IsHappy = True
ElseIf cnt > 30 Then
IsHappy = False
Else
If flag Then orig = tot
IsHappy = IsHappy(tot, False, cnt)
End If
End Function
 
You can sum the squares of the digits in a number by the following array
formula in a worksheet cell
=SUMSQ(VALUE(MID(x,ROW(OFFSET($A$1,0,0,LEN(x))),1)))
where x is the number to be evaluated. Don't forget to array enter
(Ctrl-Shift-Enter) the formula. You can then copy the formula down enough
times to identify whether the original number was happy or not.

Your "happy" condition is unclear. Is a number determined to be according
to whether the 1st 1-digit number that it maps to is 1, or whether it
ultimately maps to 1? For instance, 7 is a 1-digit number that maps to 1 in
five additional rounds (though only 2111, 1211, 1121, 1112, 1111111 can
transition to 7 in one round).

In terms of persistent 1-digit numbers, there are only two: 1 and 4. 17 of
the 90 2-digit numbers are happy.

Jerry
 
Demo'd from the immediate window
? ishappy(19)
True
? ishappy(20)
False

in a worksheet it would be

=ishappy(19)
or
=ishappy(B9) where B9 contains 19


from code, call it like any function that returns a boolean result.
Dim lngVal as Long
lngVal = 19
If ishappy(lngVal) then
 
tom:
that's what i thought, but every function i test gives me the #name? error

i type this
=ishappy(19)
i get #name?

i've tried it on the sheet and workbook code pages.

what am i doing wrong?
 
It appears that non HappyNumbers have a cycle. Maybe we can use that to
speed up the code...

Function HappyNumber(n) As Boolean
Dim p As Long
Dim d As Long
Dim t As Long
Dim s As String

If n <= 0 Then
HappyNumber = False
Exit Function
End If

s = CStr(n)

For p = 1 To Len(s)
d = Mid$(s, p, 1)
t = t + d * d
Next p

Select Case t
Case 1
HappyNumber = True
Case 2, 4, 16, 37, 58, 89, 145, 42, 20
HappyNumber = False
Case Else
HappyNumber = HappyNumber(t)
End Select
End Function

?HappyNumber(19)
True

--
Dana DeLouis
Win XP & Office 2003


Gary Keramidas said:
thanks dave, the only place i didn't try it
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Back
Top