• ベストアンサー

VBのユーザーフォームでの素数のカウント

自分でVBのユーザーフォームを使って2から指定の数までの素数がいくつあるかを求めようと思ったのですが、個数の求め方がなかなかうまくいきません。 とりあえず自分ではここまで作ってみたのですが・・・ Private Sub CommandButton2_Click() N = Val(TextBox1) For k = 2 To N kaisuu = 0 For i = 2 To N - 1 amari = N Mod i If amari = 0 Then kaisuu = kaiuu + 1 Next i If kaisuu = 0 Then kosuu = kosuu + 1 If kosuu = 0 Then TextBox3 = "0" Else TextBox3 = kosuu.Val End If Next k End Sub 自分でも探しているのですがなかなか難しいです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

'デフォルトプロパティを使わない。 '使う癖が付いているとそのうち困る時がくるから N = CInt(TextBox1.Text) '始まりを変えたので個数は1から kosuu = 1 For k = 3 To N kaisuu = 0 'iの終わりが違う For i = 2 To k - 1 '被序数(割られる数)も違う amari = k Mod i '変数名が間違っている(こういうミスは変数宣言の強制で防げる) If amari = 0 Then kaisuu = kaisuu + 1 Next i If kaisuu = 0 Then kosuu = kosuu + 1 Next k 'TextBox1に15を入力するとTextBox2に6が表示される。 '15までの素数6個とは2,3,5,7,11,13の6つ TextBox2.Text = CStr(kosuu) End Sub

ACETON
質問者

お礼

懇切丁寧なご回答ありがとうございました。 ものすごく参考にしたいと思います

その他の回答 (1)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

ソフトの質問というよりも、数学またはアルゴリズムの質問では? 最もプリミティブなロジックで考えれば、自分自身までの数で割り切れなければ素数なので、その数をカウントすれば良い。 参考まで。 Sub test() Dim k As Long, i As Long N = Val(TextBox1) kokosuu = 0 For k = 2 To N  flag = 0  For i = 2 To k - 1     '// 自分以下の整数でテスト   If k Mod i = 0 Then   '// 割切れる(素数ではない)    flag = 1    Exit For   End If  Next i  If flag = 0 Then kosuu = kosuu + 1   '// 一度も割切れない(=素数) Next k TextBox3.Value = kosuu End Sub 実際には、例のように毎回自分自身までの数で割っていたのでは、あまりにも無駄が多いですね。 即座にわかるのは、割るのはそのルートの数まででも良いはずだし、それも全数ではなくて、すでに見つけている素数で割れば事足りるはず。 ・・・などなど、もっと合理的に求めるロジックがあるはずですので、じっくりと考えてみてください。 (上の例は、ちゃんと整数として扱うためにLongの宣言をしていますので、扱える数に上限があります。)

ACETON
質問者

お礼

回答ありがとうございました。この回答を元に自分でも考えて作ってみたいと思います。

関連するQ&A

専門家に質問してみよう