Sub BangSoNguyenTo111_999()
Dim Rw As Integer, Col As Integer, Num As Integer, Cot As Integer, RwMax As Integer
ReDim Arr(1 To 50, 1 To 9) As Integer
[A1].Resize(50, 9).Value = Space(0)
For Num = 101 To 999 Step 2
If IsPrime(Num) Then
Col = Num \ 100
If Col > Cot Then
If Rw > RwMax Then RwMax = Rw
Cot = Col: Rw = 1
Else
Rw = Rw + 1
End If
Arr(Rw, Col) = Num
End If
Next Num
[A1].Resize(RwMax, 9).Value = Arr()
End Sub
Function IsPrime(n As Integer) As Boolean
Dim i As Integer
For i = 2 To Sqr(n)
If n Mod i = 0 Then
IsPrime = False: Exit Function
End If
Next i
IsPrime = True
End Function
Function GeneratePrimes(maxNumber As Long) As Long()
' Tạo sàng Eratosthenes để lọc số nguyên tố đến maxNumber
Dim sieve() As Boolean
Dim primes() As Long
Dim i As Long, j As Long, count As Long
ReDim sieve(2 To maxNumber)
For i = 2 To maxNumber
sieve(i) = True
Next i
For i = 2 To Int(Sqr(maxNumber))
If sieve(i) Then
For j = i * i To maxNumber Step i
sieve(j) = False
Next j
End If
Next i
' Đếm số nguyên tố trong khoảng 101-999
count = 0
For i = 101 To maxNumber - 2 ' Đảm bảo có 3 số liên tiếp
If sieve(i) And sieve(i + 2) And sieve(i + 4) Then
count = count + 1
End If
Next i
' Lưu các bộ ba số nguyên tố liên tiếp
ReDim primes(1 To count, 1 To 3)
count = 0
For i = 101 To maxNumber - 2
If sieve(i) And sieve(i + 2) And sieve(i + 4) Then
count = count + 1
primes(count, 1) = i
primes(count, 2) = i + 2
primes(count, 3) = i + 4
End If
Next i
GeneratePrimes = primes
End Function
Sub FindConsecutivePrimesOptimized()
Dim primes() As Long
Dim ws As Worksheet
Dim startTime As Double
startTime = Timer
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Cells.ClearContents
ws.Range("A1:C1") = Array("Prime 1", "Prime 2", "Prime 3")
' Tạo danh sách số nguyên tố và xuất kết quả
primes = GeneratePrimes(999)
If UBound(primes, 1) >= 1 Then
ws.Range("A2").Resize(UBound(primes, 1), 3).Value = primes
MsgBox "Tìm thấy " & UBound(primes, 1) & " bộ ba." & vbCrLf & _
"Thời gian chạy: " & Format(Timer - startTime, "0.000") & " giây.", vbInformation
Else
MsgBox "Không tìm thấy bộ ba nào.", vbExclamation
End If
End Sub
Function GeneratePrimes(minNumber as Long, maxNumber As Long) As Long()
' Tạo sàng Eratosthenes để lọc số nguyên tố đến maxNumber
Dim sieve() As Boolean
Dim primesList() As Long
Dim tripletArray() As Long
Dim i As Long, j As Long
Dim primeCount As Long, tripletCount As Long
' Khởi tạo sàng
ReDim sieve(2 To maxNumber)
For i = 2 To maxNumber
sieve(i) = True
Next i
For i = 2 To Int(Sqr(maxNumber))
If sieve(i) Then
For j = i * i To maxNumber Step i
sieve(j) = False
Next j
End If
Next i
' Lọc các số nguyên tố trong khoảng minNumber-maxNumber
primeCount = 0
For i = minNumber To maxNumber
If sieve(i) Then primeCount = primeCount + 1
Next i
If primeCount = 0 Then
GeneratePrimes = Array()
Exit Function
End If
' Lưu vào mảng primesList
ReDim primesList(1 To primeCount)
primeCount = 0
For i = minNumber To maxNumber
If sieve(i) Then
primeCount = primeCount + 1
primesList(primeCount) = i
End If
Next i
' Tìm các bộ ba liên tiếp trong danh sách
tripletCount = 0
For i = 1 To primeCount - 2
tripletCount = tripletCount + 1
Next i
If tripletCount = 0 Then
GeneratePrimes = Array()
Exit Function
End If
' Lưu kết quả vào mảng 2D
ReDim tripletArray(1 To tripletCount, 1 To 3)
For i = 1 To tripletCount
tripletArray(i, 1) = primesList(i)
tripletArray(i, 2) = primesList(i + 1)
tripletArray(i, 3) = primesList(i + 2)
Next i
GeneratePrimes = tripletArray
End Function
'---------------------------------------------------------
Sub FindConsecutivePrimesOptimized()
Dim primes() As Long
Dim ws As Worksheet
Dim startTime As Double
startTime = Timer
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Cells.ClearContents
ws.Range("A1:C1") = Array("Prime 1", "Prime 2", "Prime 3")
primes = GeneratePrimes(101,999) '****
If Not IsEmpty(primes) Then
ws.Range("A2").Resize(UBound(primes, 1), 3).Value = primes
MsgBox "Tìm thấy " & UBound(primes, 1) & " bộ ba." & vbCrLf & _
"Thời gian chạy: " & Format(Timer - startTime, "0.000") & " giây.", vbInformation
Else
MsgBox "Không tìm thấy bộ ba nào.", vbExclamation
End If
End Sub
Sub TaoBang100SoNguyenTo3ChuSoLonNhat()
Dim Num As Integer, Col As Integer, Cot As Integer, Rw As Integer, Dem As Integer
ReDim Arr(1 To 30, 1 To 9) As String: Dim RwMax As Integer
Sheet2.Select
[B2].Resize(30, 9).Value = Arr(): Cot = 9
For Num = 999 To 101 Step -2
If IsPrime(Num) Then
Col = Num \ 100
If Col < Cot Then
If Rw > RwMax Then RwMax = Rw
Cot = Col: Rw = 1
Else
Rw = Rw + 1
End If
Arr(Rw, Col) = CStr(Num): Dem = Dem + 1
If Dem = 100 Then
[B2].Resize(RwMax, 9).Value = Arr(): Exit Sub
End If
End If
Next Num
End Sub
//fNguyenTo
(so as number) as logical =>
let
kq= List.Count(List.Select({2..Number.RoundDown(Number.Sqrt(so))}, each Number.Mod(so, _) = 0 )) = 0
in
kq
let
// thay vong lap FOR
a = List.Generate(
() => 997,
each _ > 100,
each _ - 2,
each if fNguyenTo(_) then _ else null),
// Lay 20 ket qua dau tien
kq = List.FirstN(List.RemoveNulls(a), 20)
in
kq
Sub xyz()
Dim a(1 To 1000), res(1 To 1000, 1 To 1)
Dim xMin&, xMax&, xU, i&, j&, k&, n&
xMin = 100: xMax = 9999
For i = xMin To 2
n = n + 1: res(n, 1) = i
Next i
'Tao mang cac so nguyen to lam co so so sanh
xU = Int(Sqr(xMax))
For i = 3 To xU Step 2
For j = 1 To k
If i Mod a(j) = 0 Then Exit For
Next j
If j > k Then
k = k + 1: a(k) = i
If i >= xMin Then n = n + 1: res(n, 1) = i
End If
Next i
If n > 0 Then
If xMin < res(n, 1) Then xMin = res(n, 1) + 1
End If
xMin = ((xMin \ 2) * 2 + 1) 'Lay gia tri le
For i = xMin To xMax Step 2
For j = 1 To k
If i Mod a(j) = 0 Then Exit For
Next j
If j > k Then n = n + 1: res(n, 1) = i
Next i
Range("B2").Resize(UBound(res), 1) = res
End Sub