素数的快速列举

博主近期阅读数论文章后,回顾初学VB时利用循环查找素数的经历,随手编写了两段列举素数的代码,一段用于获取小于某数的所有素数,另一段用于获取前n个素数,并对代码进行了详细注释。

好久没来这里了。最近看了一些数论方面的文章,受益匪浅。想到我们初学VB时,利用循环查找素数是必修之课,随手写了两段列举素数的代码,并详细注释。自己感觉还是比较快的。 代码如下:


'*******************************************************************************
'  Target:to get all prime numbers smaller than a certain number      

'    Author:northwolves                                                                            

'   Reference:"Sieve of Eratosthenes"                                                    

 '   Createdate:2005-04-18 00:00:00                                                   

'*******************************************************************************

Sub showprime1(ByVal max As Long) 'find all prime numbers smaller than max(max>=3)

Dim p() As Long, i As Long, j As Long, number As Long, sqrtmax As Long, beprime As Boolean 'difinations

number = 1
ReDim p(1 To number)
p(1) = 2 ' the unique even prime number
Debug.Print p(1) 'show the first prime number

If max < 3 Then Exit Sub 'since we want do something

For i = 3 To max Step 2 ' skip those even number
     sqrtmax = Int(Sqr(i)) + 1 'get the largest non-self factor  of i
     beprime = True ' init
  For j = 1 To number ' try all primer numbers we have found before.
      If i Mod p(j) = 0 Then beprime = False: Exit For 'not a prime number
      If p(j) > sqrtmax Then Exit For 'unless we'll waste our time
  Next
 
  If beprime = True Then ' then it is a prime number
      number = number + 1 'add to it's count
      ReDim Preserve p(1 To number) 'define again
      p(number) = i
      Debug.Print i ' output the prime number
  End If

Next
Debug.Print "There are " & number & " prime numbers below " & max ' show some message

End Sub
Private Sub Command1_Click() ' show all prime numbers smaller than 100000
showprime1 100000
End Sub


'************************************************************************
'   Target:to get the first n prime numbers from 2,3,....       

'    Author:northwolves                                                   

'    Reference:"Sieve of Eratosthenes"                             

'   Createdate:2005-04-18 00:00:00                               

'************************************************************************

Sub showprime2(ByVal n As Long) ' get the first n(n>1) prime numbers

Dim p() As Long, i As Long, j As Long, number As Long, sqrtmax As Long, beprime As Boolean

number = 1
ReDim p(1 To number)
p(1) = 2 ' the unique even prime number
Debug.Print 2 'show the first prime number

If n < 2 Then Exit Sub 'since we want do something
i = 3
Do While number <= n
       sqrtmax = Int(Sqr(i)) + 1 'get the largest non-self factor  of max
       beprime = True ' init
    For j = 1 To number ' try all primer numbers we have found before.
   
        If i Mod p(j) = 0 Then beprime = False: Exit For 'not a prime number
        If p(j) > sqrtmax Then Exit For 'unless we'll waste our time
       
    Next
   
    If beprime = True Then ' then it is a prime number
        number = number + 1 'add to it's count
        ReDim Preserve p(1 To number) 'define again
        p(number) = i
        Debug.Print i ' output the prime number
    End If
i = i + 2 ' skip those even number
Loop

Debug.Print "The " & n & " prime Number Is " & p(number); "" ' show some message

End Sub

Private Sub Command2_Click() ' show the first 1000 prime numbers
showprime2 1000
End Sub

C语言实现判断质数和生成质数表的相关代码如下: ### 判断质数的C代码 以下是用于判断一个数是否为质数的C代码,若输入的数是质数,程序会输出“是素数”,否则输出“不是素数”: ```c #include<stdio.h> void Prime(int x) //x表示形参 { int i = 1; int count = 0; if (x <= 1) count = 0; else if (x == 2) count = 1; else for (i = 2; i < x; i++) { if (x % i == 0) //能被整除跳出循环无需在进行判断 { count = 0; break; } else count = 1; } if (count == 1) //若最后count=1,则是素数 printf("是素数\n"); else printf("不是素数\n"); } int main() { int a = 0; printf("判断素数->"); scanf("%d", &a); Prime(a); //调用Prime()函数 return 0; } ``` 该代码中,`Prime`函数接收一个整数`x`作为参数,通过循环从2到`x - 1`进行试除,若`x`能被其中任何一个数整除,则`x`不是质数,否则`x`是质数 [^4]。 ### 质数生成(埃拉托色尼筛选法)的C代码 埃拉托色尼筛选法可以快速列举出给定范围内的所有质数,以下是其C语言实现: ```c #include <stdio.h> #define MAX 1000 // 定义生成质数的最大范围 void sieveOfEratosthenes(int n) { int prime[MAX + 1]; for (int i = 0; i <= n; i++) { prime[i] = 1; // 初始化所有数为质数 } prime[0] = prime[1] = 0; // 0和1不是质数 for (int p = 2; p * p <= n; p++) { if (prime[p] == 1) { for (int i = p * p; i <= n; i += p) { prime[i] = 0; // 删除p的倍数 } } } // 输出所有质数 for (int p = 2; p <= n; p++) { if (prime[p] == 1) { printf("%d ", p); } } } int main() { int n = 100; // 生成1到100之间的质数 printf("1到%d之间的质数有:\n", n); sieveOfEratosthenes(n); return 0; } ``` 上述代码中,`sieveOfEratosthenes`函数实现了埃拉托色尼筛选法。首先将所有数初始化为质数,然后从2开始,将每个质数的倍数标记为非质数,最后输出所有标记为质数的数 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值