• 算法


    package main
    
    import "time"
    import "os"
    import "fmt"
    import "math"
    
    func main() {
    	timeStart := time.Now()
    	// 获取50万以内的质数(普通算法,个数41538,耗时8.7秒)
    	prime := GetPrimeLimit1(500000)
    	print("个数", len(prime), ",")
    	ShowTimeUsed(timeStart)
    	// ShowPrime(prime)               // 显示结果
    	// SavePrime("prime1.txt", prime) // 保存结果
    
    	timeStart = time.Now()
    	// 获取前5万个质数(普通算法,个数50000,耗时12.6秒)
    	prime = GetPrimeCount1(50000)
    	print("个数", len(prime), ",")
    	ShowTimeUsed(timeStart)
    	// ShowPrime(prime)               // 显示结果
    	// SavePrime("prime2.txt", prime) // 保存结果
    
    	timeStart = time.Now()
    	// 获取1亿以内的质数(筛选算法,个数5761455,耗时1.4秒)
    	prime = GetPrimeLimit2(100000000)
    	print("个数", len(prime), ",")
    	ShowTimeUsed(timeStart)
    	// ShowPrime(prime)               // 显示结果
    	// SavePrime("prime1.txt", prime) // 保存结果
    
    	timeStart = time.Now()
    	// 判断一个100亿亿级的大数是否是质数(耗时11.7秒)
    	print(IsPrime(9223372036854775783), ",")
    	ShowTimeUsed(timeStart)
    }
    
    // 获取指定范围内的质数(普通算法)
    func GetPrimeLimit1(limit int) []int {
    	// 先处理2,再处理2以上的质数
    	prime := []int{2}
    intLoop:
    	// 2以上的质数都必须是奇数
    	for i := 3; i <= limit; i += 2 {
    		// 与之前的所有质数(除了2)相除,能整除则不是质数
    		q := int(math.Sqrt(float64(i)))
    		for j := 1; j < len(prime); j++ {
    			if prime[j] <= q && i%prime[j] == 0 {
    				continue intLoop
    			}
    		}
    		prime = append(prime, i)
    	}
    	return prime
    }
    
    // 获取指定数量的质数(普通算法)
    func GetPrimeCount1(count int) []int {
    	// 先处理2,再处理2以上的质数
    	prime := []int{2}
    intLoop:
    	// 2以上的质数都必须是奇数
    	for i := 3; ; i += 2 {
    		// 与之前的所有质数(除了2)相除,能整除则不是质数
    		q := int(math.Sqrt(float64(i)))
    		for j := 1; j < len(prime); j++ {
    			if prime[j] <= q && i%prime[j] == 0 {
    				continue intLoop
    			}
    		}
    		prime = append(prime, i)
    		if len(prime) >= count {
    			break
    		}
    	}
    	return prime
    }
    
    // 获取指定范围内的质数(筛选算法)
    // 此方法转自http://blog.csdn.net/liukehua123/article/details/5482854
    func GetPrimeLimit2(num int) []int {
    	primeFlag := make([]bool, num, num)
    	primeFlag[2] = true
    	for i := 3; i < num; i += 2 {
    		primeFlag[i] = true
    	}
    	for i := 3; i <= int(math.Sqrt(float64(num))); i++ {
    		if primeFlag[i] {
    			for j := i + i; j < num; j += i {
    				primeFlag[j] = false
    			}
    		}
    	}
    	prime := []int{}
    	for i := 0; i < num; i++ {
    		if primeFlag[i] {
    			prime = append(prime, i)
    		}
    	}
    	return prime
    }
    
    // 判断一个数是否是质数
    // 此方法转自http://blog.csdn.net/l04205613/article/details/6025118
    func IsPrime(num int) bool {
    	p := []int{4, 2, 4, 2, 4, 6, 2, 6}
    	var j, q int
    	i := 7
    	if num == 1 {
    		return false
    	}
    	if num == 2 || num == 3 || num == 5 {
    		return true
    	}
    	if num%2 == 0 || num%3 == 0 || num%5 == 0 {
    		return false
    	}
    	q = int(math.Sqrt(float64(num)))
    	for i <= q {
    		for j = 0; j < 8; j++ {
    			if num%i == 0 {
    				return false
    			}
    			i += p[j]
    		}
    		if num%i == 0 {
    			return false
    		}
    	}
    	return true
    }
    
    // 显示函数执行时间
    func ShowTimeUsed(timeStart time.Time) {
    	println("耗时:", time.Now().Sub(timeStart).String())
    }
    
    // 显示结果
    func ShowPrime(prime []int) {
    	for index, value := range prime {
    		if (index+1)%10 == 0 { // 每10个质数一行
    			println(value)
    		} else if index+1 == len(prime) { // 最后一个质数后面不添加逗号
    			print(value)
    		} else {
    			print(value, ", ")
    		}
    	}
    	println()
    }
    
    // 保存结果
    func SavePrime(filename string, prime []int) {
    	f, err := os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0660)
    	if err != nil {
    		println("文件打开错误")
    		return
    	}
    	defer f.Close()
    
    	for index, value := range prime {
    		if (index+1)%10 == 0 { // 每10个质数一行
    			f.WriteString(fmt.Sprintf("%d
    ", value))
    		} else if index+1 == len(prime) { // 最后一个质数后面不添加逗号
    			f.WriteString(fmt.Sprintf("%d", value))
    		} else {
    			f.WriteString(fmt.Sprintf("%d, ", value))
    		}
    	}
    }
    
  • 相关阅读:
    【转】Maven实战(九)---模块聚合和继承
    【转】Maven实战(八)---模块划分
    Oracle ORA-01034,ORA-27101,ORA-00600
    【spring源代码分析】--Bean的解析与注冊
    ArcGIS For Flex报错
    江西省委常委赵智勇被免 无被查字眼 媒体推測窝案
    软考——(4)数据库
    matlab 2014a 改为英文版本号
    POJ 2299 Ultra-QuickSort (求序列的逆序对数)
    工厂方法模式(factory method pattern)
  • 原文地址:https://www.cnblogs.com/golove/p/5790725.html
Copyright © 2020-2023  润新知