• ベストアンサー

1から入力された数までの素因数を数えるプログラム

こんにちは 1から入力された数(N)までの素因数を数えるプログラムを 作成したいのですが、うまくいきません。 たとえば10と入力すると2と表示されてしまいます。 どこがおかしいのかわかりません。 どなたか教えてください。おねがいします。 N個の配列を用意し、1を入れていき、 素因数でない数の要素には0をいれて、 最終的に1が入っている配列の数を数えて1~Nまでの 素因数の数を数える方法を考えています。 Dim M As Integer Dim N As Integer Dim i As Integer Dim j As Integer Dim sum As Integer Dim L(1000) As Double N = Val(TextBox1) M = N i = 1 Do Until i > N L(i) = 1 i = i + 1 Loop i = 2 Do Until i > M j = i * 2 Do Until j > M L(j) = 0 j = j + 1 Loop i = i + 1 Loop sum = 0 For i = 2 To N If L(i) = 1 Then sum = sum + 1 End If Next i

  • 1724
  • お礼率57% (39/68)

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

  • ベストアンサー
  • glin
  • ベストアンサー率100% (2/2)
回答No.3

素因数というのは素数の間違いでしょうか。 もしそうであれば、素数を調べ上げる古典的な方法である「エラトステネスのふるい」のロジックを実践しようとしているように見えますが、 j = i * 2 Do Until j > M L(j) = 0 j = j + 1 Loop の部分を j = i * 2 Do Until j > M L(j) = 0 j = j + i     ← 1 ではなく i です。 Loop とする必要があります。 「エラトステネスのふるい」については検索エンジンで調べると参考になるページがいろいろ見つかるでしょう。

1724
質問者

お礼

glinさんアドバイスどうもありがとうございます。 お陰様で正常に動きました。

その他の回答 (4)

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.5

i = 2 Do Until i > M j = i * 2 Do Until j > M L(j) = 0 j = j + 1 Loop i = i + 1 Loop ここのループが 問題ですね。 どの ループが どこまで 処理されるかを 明確に しておかないと、思ってもいない 流れになりますよ。

1724
質問者

お礼

takntさん回答ありがとうございます。 確かに思ってもいない流れになりました。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

>どこがおかしいのかわかりません。 自分で見つけなければ成長しないよ。 バグの見つけ方が分からない? 一行ずつ実行しながらローカルウィンドウ、ウォッチウインドウで監視するとか。

参考URL:
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/0001/debug/
1724
質問者

お礼

todo36さん、アドバイスありがとうございます。 これからは参考URLのサイトにかかれていたことを 参考にしていこうと思います。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.2

あっ失礼。 勘違い。 さっきの無視して

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.1

http://oshiete1.goo.ne.jp/kotaeru.php3?q=153758 今まで見た中で、一番まともな約数を見つける方法 このアルゴリズム最強 約数=素数の集合を互いに掛け合わせたもの 履歴から、素数を見つける部分だけ利用をしたらいい

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=153758

関連するQ&A

  • 素因数分解について

    n = 2ml (m > 0, l は奇数)が完全数ならば、2^(m+1)l = 2n = σ(n) =(2^(m+1) -1)σ(l)。 よって、2^(m+1) -1 は2^(m+1)l を割り切る。 『したがって、素因数分解の一意性から、l は2^(m+1) - 1 を割り切る。』 『』内についてです。どうしてこのようなことが言えるのでしょうか?

  • VB 2008: Do Whie...Loop文について

    Function FileGetChar(ByVal f As String, ByVal p As Integer) As String   Dim i As Integer = 1   Dim j As Integer = 0   Dim l As Integer   Dim n As Integer = FreeFile()   Dim c As Char   If File.Exists(f) Then     FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1)     l = FileLen(f)     Do While (i + j <= l)       FileGet(n, c, i + j)       j = j - (Math.Abs(Asc(c)) > 255)       i = i + 1       If i > p Then         Exit Do       Else         c = ""       End If     Loop     FileClose(n)   End If   Return c End Function [イミディエイトウインドウ] ? FileGetChar("D:\Temp\Test.txt",1) "1" ? FileGetChar("D:\Temp\Test.txt",2) "2" と、一応は動作しています。 l------->ファイル長 i+j----->読み込みのカレントポジション p------->読み込み指示ポジション 今、悩んでいるのはDo...Loop文中のIf Else End If の追放。 何か妙手があれば教えて頂きたい。

  • エクセルVBAの繰り返し処理の質問

    C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。

  • VB.NETで素因数分解のプログラムを作成する

    2以上の整数が与えられたとき、それを素数の積に分解するプログラムを作成したいのです。 例えば、TextBox1に24と打ち込んで、Button1をクリックすると、TextBox2に2×2×2×3が表示されるといった具合です。 ↓ここからどうすれば良いか、ご教授お願い致します。 Private Sub IntegerButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n, a As Integer n = TextBox1.Text Do back: If n Mod 2 = 0 Then n = n Mod 2 = 0 Else n = n Mod 3 = 0 End If GoTo back Loop Until n = n + 1 TextBox2.Text = n & "×" End Sub End Class

  • DataTableの値を変数に代入したい

    DataTableの値を変数に代入したい 以下のコードのにてDBから『職員ID』・『氏名』を取得しSyokuin(,)の2次元配列に代入したいのですが Do Loopのところで『オブジェクト参照がオブジェクトインスタンスに設定されていません』とエラーが出ます。 ほかのところでほぼ同様のコードでデータグリッドビューに表示はうまくいくんですが? Using OleCn As New OleDbConnection(省略) Using OleCmd As New OleDbCommand(省略) Using OleDAdp As New OleDb.OleDbDataAdapter() OleCmd.Connection = OleCn '配列取得 OleDAdp.SelectCommand = OleCmd OleDAdp.Fill(OleDSet, "職員") Dim i As Integer = 0 Dim jAs Integer = 0 Do Until j= OleDSet.Tables("職員").Columns.Count - 1   Do Until i = OleDSet.Tables("職員").Rows.Count - 1   Syokuin(j, i) = OleDSet.Tables("職員").Rows(i)(j)   i += 1   Loop j += 1 Loop End Using End Using End Using ご教授お願いします

  • VBA 九九 Do While

    VBAのDo Whileステートメントを使って九九の表をつくりたいのですが、何度やっても途中で詰まり、実行に至りません。 For NextとDo untilではできたと思うのですがDo Whileがどうしてもわからなくて… どなたか助けてください。お願いします。 Sub 九九計算_for() Dim i, j As Integer For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = i * j Next Next End Sub Sub 九九計算_do_until() j = 1 Do i = 1 Do Cells(j, i).Value = i * j i = i + 1 Loop Until i = 10 j = j + 1 Loop Until j = 10 End Sub

  • 素数を求めるマクロを

    走らすと暴走したようになり、素数=151で止まります。 どこが悪いのでしょうか。正常に終わるようにしたいです。 ====================== Sub 素数を求める()   Dim i As Long   Dim j As Long   Dim m As Long   Dim p As Long   Dim flg As Boolean   i = 1   j = 1   p = 2   Do     flg = False     For m = 2 To Int(Sqr(p))       If p Mod m = 0 Then         flg = True         Exit For       End If     Next     If flg = False Then       Cells(i, j) = p       i = i + 1       If i > Rows.Count Then         i = 1         j = j + 1       End If     End If     p = p + 1   Loop End Sub ======================

  • VBA初心者です。プログラム教えてください。

    行1にA~Kの値があり、この範囲で、A列に同じ値が入っている限り1、2、3と始まる値が入るよう処理をする。A列の値が変ったら、また1からスタートする値が入るよう処理をしたい。 Sub Work() Dim M As Integer Dim N As Integer M = 2 N = 2 Do While Cells(2 ,N) <> "" Cells(3 , N) <> "" Or C = Cells(3 , N - 1)  (1) N = N + 1 Loop End Sub 上記を作りましたが、(1)の所でデバックしてしまいます。 解決策をぜひ教えてください。よろしくお願いします。

  • サンプルプログラムでエラーが出てしまいます、対処法を教えて下さい。

    Sub test写真の連続挿入()   Dim myDir As String   Dim myFile As String   Dim i As Integer   Dim n As Integer   n = 10   myDir = "D:\写真\" myFile = Dir(myDir, vbNormal)   Application.ScreenUpdating = False   Do Until myFile = ""   If myFile <> "." And myFile <> ".." Then   If (GetAttr(myDir & myFile) And 16) <> 16 Then   i = i + 1   With ActiveSheet.OLEObjects("Image" & i)    .Object.PictureSizeMode = 3    .Object.Picture = LoadPicture(myDir &myFile)   End With   If i = n Then Exit Do   End If   End If   myFile = Dir   Loop   Application.ScreenUpdating = True End Sub このWith ActiveSheet.OLEObjects("Image" & i)の行でエラーが出てしまいます、対処法を教えて下さい。( 実行時エラー'1004'OLEObjects プロパティを取得できません)

  • VBのプログラムの質問です。

    VBのプログラムの質問です。 100点満点のテストで10人分の点数を一次元配列で読み込み、各人の偏差値を含めて表示するプログラムを作りなさい。 知恵袋で一度同じような質問をしましたが、似たようなエラーが出てきてしまうために 今一度力をお貸しください、 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n As Integer = CInt(TextBox3.Text)  ←ここ Dim p(n) As Integer 'データの取得と平均計算 Dim s As Double = 0 For i As Integer = 0 To n - 1 p(i) = CInt(TextBox1.Lines(i)) s = s + p(i) Next Dim m As Double = s / n '標準偏差の計算 Dim sx As Double = 0 For i As Integer = 0 To n - 1 sx = sx + (p(i) - m) ^ 2 Next Dim sd As Double = (sx / n) ^ (1 / 2) '偏差値の表示 For i As Integer = 0 To n - 1 Dim dv As Double = 50 + 10 * (p(i) - m) / sd TextBox2.Text = TextBox2.Text & Format(dv, "##.#0") & vbCrLf Next End Sub String "" から型 'Integer' への変換は無効です。 と Dim n As Integer = CInt(TextBox3.Text)からでてしまいます。 詳しい方よろしくお願いします

専門家に質問してみよう