- ベストアンサー
エクセルで素因数を数える
エクセルを使って、素因数の数を数える方法を教えてください。 たとえば98については 98=2×7×7なので 98なら3 といった具合です。 お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは! 一案です。 ↓の画像のように別Sheet(右側がSheet2とします)に素数表を作成しておきます。 (とりあえず1000以下の素数のみとしています) 次に画面左側がSheet1とすると、 Sheet1のSheet見出し上で右クリック → コードの表示 → VBE画面(カーソルが点滅しているところ)に ↓のコードをコピー&ペースト → Excel画面に戻りA列に数値を入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から Dim i As Long, j As Long, cnt As Long, buf As String, wS As Worksheet If Intersect(Target, Range("A:A")) Is Nothing Or Target.Count > 1 Then Exit Sub Set wS = Worksheets("Sheet2") With Target If Not IsNumeric(.Value) Then Exit Sub If .Value Mod 1 = 0 And .Value <> "" Then Application.ScreenUpdating = False For j = 1 To wS.Cells(1, Columns.Count).End(xlToLeft).Column For i = 1 To wS.Cells(Rows.Count, "A").End(xlUp).Row Range("D1") = .Value If .Value Mod wS.Cells(i, j) = 0 Then Do While Cells(Rows.Count, "D").End(xlUp) Mod wS.Cells(i, j) = 0 Cells(Rows.Count, "E").End(xlUp).Offset(1) = wS.Cells(i, j) Cells(Rows.Count, "D").End(xlUp).Offset(1) = _ Cells(Rows.Count, "D").End(xlUp) / Cells(Rows.Count, "E").End(xlUp) cnt = cnt + 1 buf = buf & wS.Cells(i, j) & "×" Loop End If Next i Next j End If If Len(buf) > 2 Then .Offset(, 1) = Left(buf, Len(buf) - 1) End If .Offset(, 2) = cnt End With Range("D:E").Clear Application.ScreenUpdating = True End Sub 'この行まで ※ D・E列を作業用の列として使用していますので、C・D列は使っていない状態にしておいてください。 ※ 素数がSheet2の素数表にあれば画像のように表示されると思います。 ※ 極端に大きな数値の場合はネットで調べるともっと多くの素数表ができると思います。m(_ _)m
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
No.2です! たびたびごめんなさい。 前回のコードは慌てていたため無駄が多すぎ、なおかつ余計なループをしています。 (配置は前回の画像通りとします) 結果は同じになると思いますが、↓のコードに変更してください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, j As Long, cnt As Long, buf As String, wS As Worksheet Set wS = Worksheets("Sheet2") If Intersect(Target, Range("A:A")) Is Nothing Or Target.Count > 1 Then Exit Sub With Target If Not IsNumeric(.Value) Then Exit Sub If .Value Mod 1 = 0 Then Range("D1") = .Value For j = 1 To wS.Cells(1, Columns.Count).End(xlToLeft).Column For i = 1 To wS.Cells(Rows.Count, "A").End(xlUp).Row Do While Cells(Rows.Count, "D").End(xlUp) Mod wS.Cells(i, j) = 0 cnt = cnt + 1 buf = buf & wS.Cells(i, j) & "×" Cells(Rows.Count, "D").End(xlUp).Offset(1) = Cells(Rows.Count, "D").End(xlUp) / wS.Cells(i, j) Loop If Cells(Rows.Count, "D").End(xlUp) = 1 Then Exit For Next i Next j End If .Offset(, 1) = Left(buf, Len(buf) - 1) .Offset(, 2) = cnt End With Range("D:D").Clear End Sub ※ 今回もD列を作業用の列に使っていますので、 D列は使用していない!という条件です。m(_ _)m
- ap_2
- ベストアンサー率64% (70/109)
シート上でやるなら、ずらーっと素数を並べておいて、割り切れたらコレは素因数・・・とカウントしていくしかないかと。めんどくさい上に、あまり大きい数はムリです。 あるいはVBAか。きれいにまとまってます↓ http://egadget.blog.fc2.com/blog-entry-11.html 答えさえ出ればいいなら、こーいうサイトも。 http://keisan.casio.jp/has10/SpecExec.cgi?path=04000000.%90%94%8Aw%8C%F6%8E%AE%8FW%2F03000100.%95%FB%92%F6%8E%AE%2F11000200.%91f%88%F6%90%94%95%AA%89%F0%2Fdefault.xml