在Go中生成素数
编辑:这个问题本质上是要求生成达到某个限制的素数。原来的问题如下 如果仅满足以下两个条件,我希望我的在Go中生成素数,go,primes,Go,Primes,编辑:这个问题本质上是要求生成达到某个限制的素数。原来的问题如下 如果仅满足以下两个条件,我希望我的if语句变为true: for i := 2; i <= 10; i++ { if i%i == 0 && i%1 == 0 { } else { } } i:=2的;看来你在找我。但是,您描述的条件还不够。事实上,您必须使用算法来生成它们(最有可能达到某个限制) 其中一种是对古老的埃拉托斯坦筛的优化变化 演示: 为了完整起见: package
if
语句变为true:
for i := 2; i <= 10; i++ {
if i%i == 0 && i%1 == 0 {
} else {
}
}
i:=2的
;看来你在找我。但是,您描述的条件还不够。事实上,您必须使用算法来生成它们(最有可能达到某个限制)
其中一种是对古老的埃拉托斯坦筛的优化变化
演示:
为了完整起见:
package main
import (
"fmt"
"math"
)
// Only primes less than or equal to N will be generated
const N = 100
func main() {
var x, y, n int
nsqrt := math.Sqrt(N)
is_prime := [N]bool{}
for x = 1; float64(x) <= nsqrt; x++ {
for y = 1; float64(y) <= nsqrt; y++ {
n = 4*(x*x) + y*y
if n <= N && (n%12 == 1 || n%12 == 5) {
is_prime[n] = !is_prime[n]
}
n = 3*(x*x) + y*y
if n <= N && n%12 == 7 {
is_prime[n] = !is_prime[n]
}
n = 3*(x*x) - y*y
if x > y && n <= N && n%12 == 11 {
is_prime[n] = !is_prime[n]
}
}
}
for n = 5; float64(n) <= nsqrt; n++ {
if is_prime[n] {
for y = n * n; y < N; y += n * n {
is_prime[y] = false
}
}
}
is_prime[2] = true
is_prime[3] = true
primes := make([]int, 0, 1270606)
for x = 0; x < len(is_prime)-1; x++ {
if is_prime[x] {
primes = append(primes, x)
}
}
// primes is now a slice that contains all primes numbers up to N
// so let's print them
for _, x := range primes {
fmt.Println(x)
}
}
主程序包
进口(
“fmt”
“数学”
)
//只生成小于或等于N的素数
常数N=100
func main(){
变量x,y,n int
nsqrt:=math.Sqrt(N)
is_素数:=[N]bool{}
对于x=1;float64(x)获得“只能用自身和1整除的数”,也称为素数的最简单方法是:
这不是一个“简单的if语句”。如果你不介意它们不是素数的可能性很小(本例中为9.1e-13),你可以这样使用()
导入(
“fmt”
“数学/大”
)
func main(){
对于i:=2;i<1000;i++{
如果是大的.NewInt(int64(i)).ProbablyPrime(20){
fmt.Printf(“%d可能是素数,\n”,i)
}否则{
fmt.Printf(“%d绝对不是素数,\n”,i)
}
}
}
只需更改常量20,以确保它们是素数。简单方法(固定):
主程序包
导入“数学”
常数n=100
func main(){
打印(1,“,2)
L:对于i:=3;i这是一个golang筛的埃拉托斯烯
package main
import "fmt"
// return list of primes less than N
func sieveOfEratosthenes(N int) (primes []int) {
b := make([]bool, N)
for i := 2; i < N; i++ {
if b[i] == true { continue }
primes = append(primes, i)
for k := i * i; k < N; k += i {
b[k] = true
}
}
return
}
func main() {
primes := sieveOfEratosthenes(100)
for _, p := range primes {
fmt.Println(p)
}
}
主程序包
输入“fmt”
//返回小于N的素数列表
func-sieveoferatostenes(N int)(素数[]int){
b:=制造([]布尔,N)
对于i:=2;i
只需将外部for循环中的100更改为要查找的素数的限制。干杯
for i:=2; i<=100; i++{
isPrime:=true
for j:=2; j<i; j++{
if i % j == 0 {
isPrime = false
}
}
if isPrime == true {
fmt.Println(i)
}
}
}
对于i:=2;i在这里,通过检查所有角落案例和优化方法来尝试查找数字,并在函数返回true时运行逻辑
package main
import (
"math"
"time"
"fmt"
)
func prime(n int) bool {
if n < 1 {
return false
}
if n == 2 {
return true
}
if n % 2 == 0 && n > 2 {
return false
}
var maxDivisor = int(math.Floor(math.Sqrt(float64 (n))))
//d := 3
for d:=3 ;d <= 1 + maxDivisor; d += 2 {
if n%d == 0 {
return false
}
}
return true
}
//======Test Function=====
func main() {
// var t0 = time.Time{}
var t0= time.Second
for i := 1; i <= 1000; i++ {
fmt.Println(prime(i))
}
var t1= time.Second
println(t1 - t0)
}
主程序包
进口(
“数学”
“时间”
“fmt”
)
func素数(n int)bool{
如果n<1{
返回错误
}
如果n==2{
返回真值
}
如果n%2==0&&n>2{
返回错误
}
var maxdivisior=int(math.Floor(math.Sqrt(float64(n)))
//d:=3
对于d:=3;dpackage main
进口(
“fmt”
)
func main(){
//runtime.GOMAXPROCS(4)
ch:=制造(成交量)
去生成(ch)
为了{
素数:=AC
like逻辑(老派)
主程序包
输入“fmt”
func main(){
var num=1000
对于j:=2;j 对于i:=2;i素数是一个只能被1和自身整除的正整数。例如:2,3,5,7,11,13,17。
什么是素数?
素数是一个不能用其他整数相乘的整数
素数(或素数)是大于1的自然数,它不是两个较小的自然数的乘积。大于1的非素数的自然数称为复合数。
使用语言程序检查数字是否为素数
你确定素数检查就是这样工作的吗?你的if语句可以翻译成“if true”。可能不是。但是,如果像我请求的那样的语句可能吗?它严格遵循条件吗?@albind您的if语句检查I
是否可以被自身和1
均匀整除。所有数字都是。因此,您的if语句不排除任何数字。是否可以排除除I和1之外的所有数字(在本例中)公平地说,这是最简单合理有效的方法,但是O(N^2)嵌套<代码>对于循环更简单。@ PATATOSWATER足够公平。但是我认为这相当于冒泡排序。由于它的简单性,它很容易记住,并导致人们只记住它,然后在多年后的生产中找到它,同时试图找出为什么简单的东西会永远执行。如果同事实现了快速排序,ally会感到不安,因为库的实现很好。花在快速排序或冒泡排序上的时间也同样浪费了。这真是太神奇了,感谢并为我的错误道歉uncunningness@Agis,我认为代码没有按预期工作。我得到了从0到24的所有整数。@siritinga有一个拼写错误。现已修复。我只是添加了素数to上次fmt.Println(x,primes)编辑:再次尝试你的编辑:现在效果很好1270606代表什么?他想生成素数,而不是检查素数。我可以知道为什么k:=I*I
而不是k:=I
?我明白了-所有的数字都以I*x
的形式出现在[2,I-1]
已在前面的外部循环中标记,其中i=x
for i:=2; i<=100; i++{
isPrime:=true
for j:=2; j<i; j++{
if i % j == 0 {
isPrime = false
}
}
if isPrime == true {
fmt.Println(i)
}
}
}
package main
import (
"math"
"time"
"fmt"
)
func prime(n int) bool {
if n < 1 {
return false
}
if n == 2 {
return true
}
if n % 2 == 0 && n > 2 {
return false
}
var maxDivisor = int(math.Floor(math.Sqrt(float64 (n))))
//d := 3
for d:=3 ;d <= 1 + maxDivisor; d += 2 {
if n%d == 0 {
return false
}
}
return true
}
//======Test Function=====
func main() {
// var t0 = time.Time{}
var t0= time.Second
for i := 1; i <= 1000; i++ {
fmt.Println(prime(i))
}
var t1= time.Second
println(t1 - t0)
}
package main
import (
"fmt"
)
func main() {
//runtime.GOMAXPROCS(4)
ch := make(chan int)
go generate(ch)
for {
prime := <-ch
fmt.Println(prime)
ch1 := make(chan int)
go filter(ch, ch1, prime)
ch = ch1
}
}
func generate(ch chan int) {
for i := 2; ; i++ {
ch <- i
}
}
func filter(in, out chan int, prime int) {
for {
i := <-in
if i%prime != 0 {
out <- i
}
}
}
package main
import "fmt"
func main() {
var num = 1000
for j := 2; j < num ; j++ {
var flag = 0
for i := 2; i <= j/2 ; i++ {
if j % i == 0 {
flag = 1
break
}
}
if flag == 0 {
fmt.Println(j)
}
}
}