zoukankan      html  css  js  c++  java
  • 算法

    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))
    		}
    	}
    }
    
  • 相关阅读:
    TCP的核心系列 — SACK和DSACK的实现(一)
    Linux2.6中的Slab层
    UVA 11549 Calculator Conundrum (Floyd判圈算法)
    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案
    hdu-Common Subsequence
    UVA 10869
    【Struts2学习笔记(3)】至Action注入属性值
    【winows7+android-ndk-r9+Cygwin 】cocos2dx 2.*游戏移植Android平台完全手册
    Ubuntu 14.04 64位字体美化(使用黑文泉驿)
    Android Fragment——详细解释
  • 原文地址:https://www.cnblogs.com/golove/p/5790725.html
Copyright © 2011-2022 走看看