[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『素数判定プログラミング』(初心者です。)
1.与えられた整数値 x が素数か否かを判定する Function プロシージャ primF を作成する。この Function プロシージャはユーザとは対話せず、引数で x を受け取り、戻り値として True または False を返すようにしたいです。その時、InputBox や MsgBox のようなユーザと対話するためのダイアログボックスは表示しないようにしたいです。
2.与えられた整数値 x を素因数分解する Function プロシージャ factorizeF を作りたいです。1と同様、引数と戻り値だけでデータを処理するようにしたいです。
3.Excel ワークシート上から primF と factorizeF を呼び出し、十分に動作を確認できるようにしたいです。
4.factorizeF の戻り値となる文字列表現を整理し、 [ ] で囲んだ数値リストが返されるように整えて、最初だけカンマ(,)が s に入り込むのを抑制し、一番最後に開き括弧([)と閉じ括弧(])で囲えるようにしたいです。
下二個のプログラミングが分かりませんでした。質問が多くて、申し訳ないのですが、教えていただけると助かります。
'素数を判定するSubプロシージャ
Sub primS()
Const title As String = "素数判定"
Dim x As Integer
Dim k As Integer
x = InputBox("整数値(2〜32767)", title)
For k = 2 To x If x Mod k = 0 Then Exit For Next k
If k < x Then MsgBox x & "は素数ではありません。(" & k & "で割れました。)", , title Else MsgBox x & "は素数です。", , title End If End Sub
'素因数分解をするSubプロシージャ
Sub factorizeS()
Dim x As Integer, y As Integer
Dim k As Integer
Dim s As String
x = InputBox("整数値(2〜32767)", "素因数分解") y = x k = 2 Do If y Mod k = 0 Then s = s & ", " & k y = y \ k Else k = k + 1 End If Loop Until y = 1
MsgBox x & " ⇒ " & s, , "素因数分解" End Sub
'素数を判定するFunctionプロシージャ
Function primF(x As Integer) As Boolean
primF = True End Function
'素因数分解をするFunctionプロシージャ
Function factorizeF(x As Integer) As String
factorizeF = ",1,2,3,4,5" End Function
< 使用 Excel:unknown、使用 OS:unknown >
基本的なロジックはサブプロシージャで与えられているわけですから、
その内容を理解して、Functionプロシージャに変換するという問題ですね。
途中までで結構ですから頑張ってみた結果を示してみてください。
# n が素数であるかの判定は、普通は ルートn までの整数を使って
判定すれば足りるわけですが、
# そうした考慮はないですし、学習問題ということなんでしょう。
(γ) 2022/01/06(木) 22:36
If x Mod 2 = 0 Then
primF = False
Exit Function
End If
r = Int(Sqr(x))
For k = 3 To r Step 2
If x Mod k = 0 Then
primF = False
Exit Function
End If
Next k
primF = True
End Function
Function factorizeF(x As Integer)
r = Int(Sqr(x))
factorizeF = "["Do While x Mod 2 = 0
factorizeF = factorizeF &"2,"x = x / 2
Loop
For k = 3 To r Step 2
Do While x Mod k = 0
factorizeF = factorizeF &k &","x = x / k
Loop
Next k
If x >= k Then
factorizeF = factorizeF & x & "]"
Else
factorizeF = Left(factorizeF, Len(factorizeF) - 1) & "]"
End If
End Function
どうしてもfactorizeF = のところができません
(初心者です。) 2022/01/07(金) 00:32
サブプロシージャをそのまま活用したほうがよいと思います。課題なんでしょうから。 サブプロシージャで作成した文字列 s を加工するだけでよいと思います。
Function factorizeF(x As Long) As String Dim s As String Dim y As Long Dim k As Long
y = x k = 2 Do If y Mod k = 0 Then s = s & ", " & k y = y \ k Else k = k + 1 End If Loop Until y = 1
factorizeF = "[" & Mid(s, 2) & "]" ' 修正はここだけです。 End Function (γ) 2022/01/07(金) 01:11
Function primF(x As Long) As Boolean Dim k As Long If x > 1 Then For k = x ^ 0.5 To 2 Step -1 If x Mod k = 0 Then Exit Function End If Next primF = True End If End Function
Function FactorizeF(x As Long) As String FactorizeF = "[" & Factoring(x) & "]" End Function
Function Factoring(x As Long) As String Dim buf As String Dim k As Long If x > 1 Then For k = x ^ 0.5 To 2 Step -1 If x Mod k = 0 Then buf = MargeF(Factoring(k), Factoring(x \ k)) Exit For End If Next If buf = "" Then buf = x End If Factoring = buf End If End Function
Function MargeF(x As String, y As String) As String Const D As String = "," Dim xVar, yVar Dim i As Long, ix As Long, iy As Long xVar = Split(x, D) yVar = Split(y, D) ReDim Var(UBound(xVar) + UBound(yVar) + 1) For i = 0 To UBound(Var) Select Case True Case iy > UBound(yVar) Var(i) = xVar(ix) ix = ix + 1 Case ix > UBound(xVar) Var(i) = yVar(iy) iy = iy + 1 Case CLng(xVar(ix)) < CLng(yVar(iy)) Var(i) = xVar(ix) ix = ix + 1 Case Else Var(i) = yVar(iy) iy = iy + 1 End Select Next MargeF = Join(Var, D) End Function
雑ですが別案
あまり課題の解答向きの内容ではありません
(きまぐれおじさん) 2022/01/07(金) 04:13
こんなことかな? xが2以上の判定を入れないとマズい気がします。
'素数を判定するSubプロシージャ Function primS(x As Integer) As Boolean Dim k As Integer
If x < 2 Then primS = Null Exit Function Else For k = 2 To x If x Mod k = 0 Then Exit For Next k
primS = k >= x End If End Function
'素因数分解をするSubプロシージャ Function factorizeS(x As Integer) Dim y As Integer Dim k As Integer Dim s As String
If x < 2 Then factorizeS = Null Exit Function Else y = x k = 2
Do If y Mod k = 0 Then s = s & ", " & k y = y \ k Else k = k + 1 End If Loop Until y = 1
factorizeS = x & " ⇒ " & Right(s, Len(s) - 2) End If End Function
'素数を判定するFunctionプロシージャ Function primF(x As Integer) As Boolean primF = primS(x) End Function
'素因数分解をするFunctionプロシージャ Function factorizeF(x As Integer) As String factorizeF = factorizeS(x) End Function
(半平太) 2022/01/07(金) 06:43
質問の課題から離れて、 素因数分解をワークシート上で多数実行するとした場合(*)の方法を考えてみました。 対象範囲内の素数を予め算定しておき、それをdictionaryに持つという案です。
・素数列挙 が、素数を調べて辞書に持つ部分 ・素数判定 これは、辞書にあれば素数と判定します ・素因数分解 整数の素因数分解をカンマ区切りで返す、ユーザー定義関数です。 ワークシートに置けます。
ご参考まで。 (*)と言われても、こんなこと実生活ではありえないですけどね。ま、遊びということで。)
Option Explicit Dim dic As Object
'素数テーブルがあるかチェックし、なければ作成 Sub checkPrimeTable() If dic Is Nothing Then Set dic = CreateObject("Scripting.Dictionary") Call 素数列挙 End If End Sub
' 1から32767までの素数をdictionaryに持つ Sub 素数列挙() Const c As Long = 32767 Dim c2 As Long Dim j&, k& c2 = Int(c ^ 0.5)
ReDim mat(1 To c) For k = 2 To c2 j = k Do Until j > c - k j = j + k mat(j) = 1 Loop Next For k = 2 To c If mat(k) = 0 Then dic(k) = Empty Next End Sub
'素数ならtrueを返す Function 素数判定(ByVal n As Long) Call checkPrimeTable 素数判定 = dic.Exists(n) End Function
Function 素因数分解(ByVal n As Long) As String Dim n2 As Long Dim aryL As Object Dim prime As Variant
Call checkPrimeTable
If 素数判定(n) Then 素因数分解 = CStr(n) Exit Function End If
Set aryL = CreateObject("System.Collections.ArrayList") n2 = Int(n ^ 0.5) For Each prime In dic.Keys If prime > n2 Then Exit For Do Until n Mod prime <> 0 aryL.Add prime n = n / prime If 素数判定(n) Then aryL.Add n Exit For End If If n = 1 Then Exit For Loop Next 素因数分解 = Join(aryL.ToArray, ",") End Function
(γ) 2022/01/07(金) 14:30
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.