min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

素数か判定するExcelプログラムを書く(VBA)

f:id:min117:20201115143747p:plain

入力された数字が素数かどうかを判定したい。関数とか公理公式を使わないで独自で実装する。

f:id:min117:20201115145634g:plain

 

素数とは…

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ではない数で割れてしまったら、素数じゃない。

 

これを実装する。

 

できた。

f:id:min117:20201115145603g:plain

 

13は素数かな?

f:id:min117:20201115145634g:plain

もちろん素数です。

 

じゃあ103は?

f:id:min117:20201115145806g:plain

素数です!Prime Number!

 

なら287は?

f:id:min117:20201115145913g:plain

素数じゃないです!ぐあぁぁぁ(7で割れます)。

 

じゃあ997!

f:id:min117:20201115150042g:plain

素数です!

 

どんどんいきましょう。1025は?

f:id:min117:20201115150134g:plain

もちろん違う。素数じゃないです。5で割れます。

 

1027は?

f:id:min117:20201115150147g:plain

素数じゃないです!13で割れます。

 

じゃあポッキーの日(20201111)は素数か?

f:id:min117:20201115150207g:plain

素数じゃないです!7で割れます。

 

着想はこれだったり。

f:id:min117:20201115152945p:plain

 

今年の年末は?(20201231)

f:id:min117:20201115151219g:plain

時間かかりすぎぃ…

tools.m-bsys.com

 

内部の動作はこんな感じ。

f:id:min117:20201115151612g:plain

「入力されたセルの数字(C8)」を、

1から「入力されたセルの数字(C8)」まで順番に、1ずつ足していった数で割ればいいだけ。

 

コードはこれ。

f:id:min117:20201115152201p:plain

f:id:min117:20201115152236p:plain

メモ

・「割り切れるか?」は「割って余りがあるか?」なので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

 

qiita.com

 

genzouw.com