From dfc0b71eb6c46c8f48c1f9e4fc68f1f927ddb574 Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Tue, 5 Oct 2021 12:44:19 +0100 Subject: - Added guest contributions by Eric Cheung. --- .../eric-cheung/excel-vba/Challenge_133.xlsm | Bin 0 -> 34523 bytes challenge-133/eric-cheung/excel-vba/ch-1.bas | 50 ++++++++++ challenge-133/eric-cheung/excel-vba/ch-2.bas | 103 +++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100755 challenge-133/eric-cheung/excel-vba/Challenge_133.xlsm create mode 100755 challenge-133/eric-cheung/excel-vba/ch-1.bas create mode 100755 challenge-133/eric-cheung/excel-vba/ch-2.bas diff --git a/challenge-133/eric-cheung/excel-vba/Challenge_133.xlsm b/challenge-133/eric-cheung/excel-vba/Challenge_133.xlsm new file mode 100755 index 0000000000..cbd7ff6fab Binary files /dev/null and b/challenge-133/eric-cheung/excel-vba/Challenge_133.xlsm differ diff --git a/challenge-133/eric-cheung/excel-vba/ch-1.bas b/challenge-133/eric-cheung/excel-vba/ch-1.bas new file mode 100755 index 0000000000..afb640a377 --- /dev/null +++ b/challenge-133/eric-cheung/excel-vba/ch-1.bas @@ -0,0 +1,50 @@ +Attribute VB_Name = "ModTask_01" +Option Explicit +Public Const strMyTitle As String = "Eric Cheung" + +Function FindIntDivTwo(nNum As Double) As Long + + FindIntDivTwo = Int(nNum / 2) + +End Function + +Function FindIntSqrRoot(nInput As Long) As Long + + Dim nTemp As Long + + nTemp = FindIntDivTwo(CDbl(nInput)) + + If nTemp = 0 Then + FindIntSqrRoot = nInput + Exit Function + End If + + FindIntSqrRoot = FindIntDivTwo(CDbl(nTemp + nInput / nTemp)) + + Do While FindIntSqrRoot < nTemp + nTemp = FindIntSqrRoot + FindIntSqrRoot = FindIntDivTwo(CDbl(nTemp + nInput / nTemp)) + Loop + +End Function + +Sub Task_01() + + ''Remarks + ''https://theweeklychallenge.org/blog/perl-weekly-challenge-133/ + ''https://en.wikipedia.org/wiki/Integer_square_root + ''https://www.geeksforgeeks.org/left-shift-right-shift-operators-c-cpp/ + + Dim strMsg As String + Dim nIntSqr As Long + + '' nIntSqr = 10 '' Example: 1 + '' nIntSqr = 27 '' Example: 2 + '' nIntSqr = 85 '' Example: 3 + nIntSqr = 101 '' Example: 4 + + strMsg = "Integer Square Root of " & nIntSqr & " is: " + CStr(FindIntSqrRoot(nIntSqr)) + + MsgBox strMsg, vbOKOnly, strMyTitle + +End Sub diff --git a/challenge-133/eric-cheung/excel-vba/ch-2.bas b/challenge-133/eric-cheung/excel-vba/ch-2.bas new file mode 100755 index 0000000000..554bbdbc6d --- /dev/null +++ b/challenge-133/eric-cheung/excel-vba/ch-2.bas @@ -0,0 +1,103 @@ +Attribute VB_Name = "ModTask_02" +Option Explicit +Option Base 1 +Public nPrimeArr() As Long +Public nPrimePow() As Long + +Function IsPrime(nInput As Long) As Boolean + + Dim nNumLoop As Integer, nTempInt As Long + Dim bFlag As Boolean + + bFlag = False + + For nNumLoop = LBound(nPrimeArr) To UBound(nPrimeArr) + nPrimePow(nNumLoop) = 0 + Next nNumLoop + + nNumLoop = LBound(nPrimeArr) + nTempInt = nInput + + Do While nNumLoop <= UBound(nPrimeArr) + If nTempInt Mod nPrimeArr(nNumLoop) = 0 Then + nTempInt = nTempInt / nPrimeArr(nNumLoop) + nPrimePow(nNumLoop) = nPrimePow(nNumLoop) + 1 + bFlag = True + Else + nNumLoop = nNumLoop + 1 + End If + Loop + + If bFlag Then + IsPrime = False + Else + IsPrime = True + End If + +End Function + +Function SumOfDigits(nInput As Long) As Integer + + Dim nTempNum As Long + + nTempNum = nInput + Do While nTempNum > 0 + SumOfDigits = SumOfDigits + nTempNum Mod 10 + nTempNum = Int(nTempNum / 10) + Loop + +End Function + +Function IsSmith(nInput As Long) As Boolean + + Dim nNum_01 As Integer, nNum_02 As Integer, nNumLoop As Integer + + nNum_01 = SumOfDigits(nInput) + + For nNumLoop = LBound(nPrimeArr) To UBound(nPrimeArr) + nNum_02 = nNum_02 + SumOfDigits(nPrimeArr(nNumLoop)) * nPrimePow(nNumLoop) + Next nNumLoop + + If nNum_01 = nNum_02 Then + IsSmith = True + Else + IsSmith = False + End If + +End Function + +Sub Task_02() + + Dim strMsg As String + Dim nLoop As Long, nCnt As Integer, nPrimeCnt As Long + + ReDim nPrimeArr(1 To 1) + ReDim nPrimePow(1 To 1) + + nPrimeCnt = 1 + nPrimeArr(1) = 2 + + nLoop = 3 + nCnt = 0 + + strMsg = "First 10 Smith Numbers in base 10 are " + + Do While (nCnt < 10) + If Not IsPrime(nLoop) Then + If IsSmith(nLoop) Then + strMsg = strMsg & ", " & nLoop + nCnt = nCnt + 1 + End If + Else + nPrimeCnt = nPrimeCnt + 1 + ReDim Preserve nPrimeArr(1 To nPrimeCnt) + ReDim nPrimePow(1 To nPrimeCnt) + nPrimeArr(nPrimeCnt) = nLoop + End If + nLoop = nLoop + 1 + Loop + + MsgBox strMsg, vbOKOnly, strMyTitle + +End Sub + -- cgit