Visual Basic-ben írtam egy prímszámoló programot, de rosszul számol, mi lehet a baja?
Imports System.Console
Imports System.IO
Module Module1
Sub Main()
Dim ki As New StreamWriter("primszam.txt")
Dim n As Integer = 10000
Dim e As Integer
Dim d As Integer
Dim b As Integer
b = Val(n ^ 0.5)
For i As Integer = 1 To n
e = 0
For d = 1 To b
If (i Mod d) = 0 Then
e = e + 1
End If
Next
If e = 2 Then
ki.WriteLine(i)
'Write(i & " ")
End If
Next
ki.Close()
End Sub
End Module
ezt csináltam és nem ad jó számokat kb 150-ig jó, de utána nem. legelőször nem val()függvénnyel csináltam hanem az "n" változóig futtattam a 2. for ciklust is. és ugye úgy a gyorsabb ha csak a szám gyökéig csináljuk és azért írtam bele a "b = Val(n ^ 0.5)" ami elvileg veszi a szám gyökét majd veszi az egész részét. de valamiért nem jó ! tesz bele páros számokat is :D. Egyáltalán a val() egészre kerekít? (neten kerestem rá). előre is köszönöm a segítségeket!
Előre leszögezem hogy nem értek a VisualBasichez, szóval lehet hogy hüleség.
Hogyha a gyökéig mész, akkor a "e" osztó csak az 1 lehet prímszámnál.
Egy szám akkor prím, ha nem osztható a gyökénél kisebb egyik prímszámmal sem.
És nem pedig "egy szám akkor prím, ha a keresendő legnagyonn lehetséges prímszám (n) gyökéig lévő prímek közül egyikkel sem osztható" :P
Az előző válaszolónak igaza van. Viszont a programod azért jó kb. 150-ig, mert gyök alatt 100000 = 100.
A programodban az ennél kisebb számoknál mindig elmész 100-ig.
Amúgy prímkeresésre ennél jobb módszer is van:
Bár több memóriát eszik... viszont jóval gyorsabb ennél.
most ott tartok, hogy a sima prímszámkereső program jól működik, de ez a prímkeresés egy programnak csak az egyik része lenne, és ott nem működik, esetleg, ha valaki ezt megnézni akkor megköszönném, remélem átlátható lesz nagyjából :
Sub primkereses()
Dim ki As New StreamWriter("primszam.txt")
Dim e As Integer
Dim d As Integer
Dim gyok As Integer
gyok = Val(szam ^ 0.5)
For kl As Integer = tombtxt.Max + 1 To szam
e = 0
For d = 1 To gyok
If (kl Mod d) = 0 Then
e = e + 1
End If
Next
If e = 0 Then
ki.WriteLine(kl)
q1 = q1 + 1
'WriteLine(kl)
End If
Next
ki.Close()
End Sub
itt viszont rossz eredményeket hoz ki (itt a programban kéri be a számot amíg számoljon) ez egész program (ez csak 1 szelete) egy ciklusra épül és mindig a tombtxt nevű tömb-be menti el a prímeket és akkor ha indul a program megnézi, hogy a tömbbe mekkora a legnagyobb szám (az az utolsó kiszámolt prím) és onnantól az új számig keresse meg a prímeket. remélem érthető :D
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!