入力された数字が素数かどうかを判定したい。関数とか公理公式を使わないで独自で実装する。
素数とは…
1またはその数自身でしか割れない数。
例えば13。
1または13でしか割れない
→ 素数です。
例えば19。
1または19でしか割れない
→ 素数です。
じゃあ21は?
1または3または21で割れる
→ 1と21ではない数(=3)で割れちゃう
→ 素数じゃない。
ってことは、素数か確かめるにはどうコーディングするか?
例えば21が素数か?と言われたら?
→ 21を、1から順番にその数(21)まで(1,2,3,4,5.....21と)割って行って
→ 1と21ではない数で割れてしまったら、素数じゃない。
これを実装する。
できた。
13は素数かな?
もちろん素数です。
じゃあ103は?
素数です!Prime Number!
なら287は?
素数じゃないです!ぐあぁぁぁ(7で割れます)。
じゃあ997!
素数です!
どんどんいきましょう。1025は?
もちろん違う。素数じゃないです。5で割れます。
1027は?
素数じゃないです!13で割れます。
素数じゃないです!7で割れます。
着想はこれだったり。
今年の年末は?(20201231)
時間かかりすぎぃ…
内部の動作はこんな感じ。
「入力されたセルの数字(C8)」を、
1から「入力されたセルの数字(C8)」まで順番に、1ずつ足していった数で割ればいいだけ。
コードはこれ。
メモ
・「割り切れるか?」は「割って余りがあるか?」なのでmodを使う。
・素数を見つけた瞬間にループをブレイク(Exit For)しないと(大きい数を入れたときに)永遠に終わらない。
・C13:J22の表示領域に数字を見せるのが結構苦労する(画面のクリアとか)。
コピペ用
Sub prime()
'Debug.Print 123
Dim in_num As Long
Dim cnt As Long
Dim quo_num As Long 'quotient 商
Dim mod_num As Long
Dim NG_FLG As Integer '割り切れたらON(素数じゃなければON)
Dim roww As Long
Dim coll As Long
in_num = 0
NG_FLG = 0
Range("C9") = ""
Range("C10") = ""
roww = 0
coll = 0
'in_num = Cells(6, 3)
in_num = Range("C8")
Debug.Print in_num
roww = 13
coll = 1
Range(Range("A13"), Range("A" & Cells.Rows.Count)).EntireRow.Delete
'1から入力された数字まで繰り返す
For cnt = 1 To in_num
'Debug.Print cnt
Debug.Print in_num & "÷" & cnt
quo_num = in_num / cnt
Debug.Print "商:" & quo_num
mod_num = in_num Mod cnt
Debug.Print "余り:" & mod_num
If (mod_num = 0) And (cnt <> in_num) And (cnt <> 1) Then
'Debug.Print "余り0です/割り切れます/素数じゃないです"
Debug.Print cnt & "で割れます"
Range("C10") = cnt & "で割れます"
NG_FLG = 1
Exit For
End If
'表示用C13:J22
If cnt Mod 10 = 0 Then
roww = roww + 1
coll = 0
Debug.Print roww
End If
If cnt Mod 100 = 0 Then
roww = 13
coll = 0
Debug.Print roww
Range(Range("A12"), Range("A" & Cells.Rows.Count)).EntireRow.Delete
'Range(A13, A50).EntireRow.Clear
End If
coll = coll + 1
Cells(roww, coll) = cnt
Debug.Print "---------"
Next cnt
If NG_FLG = 1 Then
Debug.Print "素数じゃないです"
Range("C9") = "素数じゃないです ぐあぁぁぁ"
Cells(roww, coll + 1).Interior.Color = RGB(255, 255, 0)
Cells(roww, coll + 1) = cnt
Else
Debug.Print "素数です!Prime Number"
Range("C9") = "素数です!Prime Number"
Cells(roww, coll).Interior.Color = RGB(255, 255, 0)
End If
End Sub