回 帖 发 新 帖 刷新版面

主题:关于质数(素数)我有我主张(狂吐血自荐24楼函数)

楼顶给人砸了
(网页错误,原楼主贴丢失)
没关系,原函数已经有了新生
我修改了放到第二楼去了.

现在又有了新收获,又有了卖弄的新资本.
如果只是需要判断某数是否质数的话,
看看22楼新程序,看是否能看出点什么来.......

22楼代码是简单了点,又改进优化一下得24楼最新代码.
至于质数表的生成,仍然在尝试加快速度,
现在在计算8位数的时候,每秒速度已经从十万降到五千个了,
看样子是越来越慢,看有没有办法能加快点速度吧.

回复列表 (共27个回复)

21 楼

作些许改良,以解决文件过大时检查速度过慢的问题。

FUNCTION IsZhiShu& (a&)

f% = FREEFILE
OPEN "质数表" FOR RANDOM AS #f% LEN = LEN(a&)

IF LOF(f%) = 0 THEN
     z& = 2 :  PUT #f%, , z&
     z& = 3 :  PUT #f%, , z&
     z& = 5 :  PUT #f%, , z&
     z& = 7 :  PUT #f%, , z&
END IF

e& = LOF(f%) \ LEN(a&)
GET #f%, e&, z&

SELECT CASE a&
CASE IS <= 2
  IsZhiShu& = 2
CASE IS >= z&
  DO UNTIL z& >= a&
    DO
      z& = z& + 2
      q& = SQR(z&)
      if (z& mod 3)>0 and (z& mod 5)>0 then
        i& = 4
        DO
          GET #f%, i&, k&
          IF z& MOD k& = 0 THEN EXIT DO
          i& = i& + 1
        LOOP UNTIL k& > q&
      end if
    LOOP UNTIL k& > q&
    e& = e& + 1
    PUT #f%, e&, z&
    'LOCATE 5, 5: PRINT e&, z&
  LOOP
  IsZhiShu& = z&
CASE IS < z&

  m& = e& * a& / z&
  If m& < 1 Then m& = 1
  Get #f%, m&, b&
  
  If b& > a& Then l& = m& - (b& - a&)\3 -2 else  l&=m&
  If b& < a& Then r& = m& + (a& - b&)\3 +2 else  r&=m&
  If l& < 1 Then  l&=1
  if r& > e& then r&=e&

  DO
    m& = (r& + l&) / 2
    GET #f%, m&, b&
    IF a& > b& THEN l& = m& ELSE r& = m&
  LOOP UNTIL r& - l& < 2
    GET #f%, r&, b&
  IsZhiShu&=b&
END SELECT
    CLOSE #f%
END FUNCTION

22 楼

这两天天山雪莲来踩场来了,
今晚有点气不过,
脑袋有点糊涂了,
结果又弄了一个程序出来,
功能很少,只能判断一个整数是否质数,
至于正确与否,不敢说.
但比起前面冗长的程序来说,
的确是快又精.

DefLng A-Z
Function iszhisu(m)
If m Mod 2 = 0 Or m Mod 3 = 0 Or m Mod 5 = 0 Then Exit Function
q = Sqr(m)
If q Mod 2 = 0 Then q = q + 1
l = q
r = q
Do Until l < 5 Or r > m
  Select Case r * l
  Case m: Exit Function
  Case Is > m: l = l - 2
  Case Is < m: r = r + 2
  End Select
Loop
iszhisu = -1
End Function

23 楼

你应该把题目改成“关于质数(素数)我有我主张(狂吐血自荐23楼的)”了。
DECLARE FUNCTION isprime! (i!)
CLS
OPEN "12345.txt" FOR OUTPUT AS #1
DIM SHARED a$
DEFINT N
1 INPUT n
IF n <= 1 THEN 1
IF n = 2 THEN PRINT 2: WRITE #1, 2: END
IF n = 3 OR n = 4 THEN PRINT 2; 3: WRITE #1, 2: WRITE #1, 3: END
PRINT 2; 3; 5; : WRITE #1, 2: WRITE #1, 3: WRITE #1, 5
IF n = 5 OR n = 6 THEN END
a$ = STRING$(n, "0")
MID$(a$, 2, 2) = "11"
MID$(a$, 5, 1) = "1"
k = n \ 6
IF n MOD 6 = 0 THEN k = k - 1
FOR i = 1 TO k
    IF i * 6 + 1 > n THEN EXIT FOR
    IF isprime(i * 6 + 1) THEN
       PRINT i * 6 + 1; : WRITE #1, i * 6 + 1
       MID$(a$, i * 6 + 1, 1) = "1"
    END IF
    IF i * 6 + 5 > n THEN EXIT FOR
    IF isprime(i * 6 + 5) THEN
       PRINT i * 6 + 5; : WRITE #1, i * 6 + 5
       MID$(a$, i * 6 + 5, 1) = "1"
    END IF
NEXT i
END

FUNCTION isprime (i)
FOR j = 5 TO INT(SQR(i))
    IF i MOD j = 0 THEN isprime = 0: EXIT FUNCTION
    j = INSTR(j + 1, a$, "1") - 1
NEXT j
isprime = 1
END FUNCTION

24 楼

经过改良后的程序,速度再次加快了.

DEFLNG A-Z
FUNCTION IsZhiSu (m)
IF m MOD 2 = 0 OR m MOD 3 = 0 OR m MOD 5 = 0 THEN EXIT FUNCTION
q = SQR(m)
IF q MOD 2 = 0 THEN q = q + 1
r = q
l = q
m5 = m \ 5
DO UNTIL l < 7 OR r > m5
   rl = r * l
   SELECT CASE rl
   CASE m: EXIT FUNCTION
   CASE IS > m
        t = (rl - m) \ r \ 2 * 2
        IF t = 0 THEN l = l - 2 ELSE l = l - t
        IF l MOD 10 = 5 THEN l = l - 2
   CASE IS < m
        t = (m - rl) \ l \ 2 * 2
        IF t = 0 THEN r = r + 2 ELSE r = r + t
        IF r MOD 10 = 5 THEN r = r + 2
   END SELECT
LOOP
IsZhiSu = -1
END FUNCTION


程序里好像有错,至于在哪个地方还没想清楚.

25 楼

To:  Mato

学习是挺快的,不过不想给你评分.倒是有两个建议:
1. 看那字符串就知道走不出64K的范围
2. 要学会使用变量来代替重复的计算表达式.
0. 看懂了别人的代码再来评论.没有了解就没有发言权.

26 楼

是挺不错的。但是你为什么在写程序时喜欢在变量后面加一个符号:&。不美观。
不过程序简便实用。

我来回复

您尚未登录,请登录后再回复。点此登录或注册