首页 >> 旅游

互质(互质是什么意思)

2022年04月01日 11:10:22 旅游 17 投稿:用户投稿

2021-05-31:怎么判断n个数俩俩互质?比如7,8,9任意两个数最大公约数是1,所以7,8,9两两互质。比如8,9,10不是两两互质,因为8和10的最大公约数是2。

福大大 答案2021-05-31:

方法一:两两判断最大公约数是否为1。时间复杂度是O(N^2)。

方法二:求乘积,然后求最大公约数。看起来时间复杂度是O(N),但求乘积的代价非常大,不如方法一。

方法三:遍历数组,求每个元素的质因数,然后存map。下一个元素求质因数,如果map里已经存在,说明不是两两互质了。时间复杂度O(N)。空间复杂度O(质因数个数)。对于小整数,此方法很不错。对于大整数,不如方法一。

代码用golang编写。代码如下:

package mainimport ( "fmt" "math/rand" "time")func main() { rand.Seed(time.Now().Unix()) count := 0 const TOTAL = 100 for i := 0; i < TOTAL; i++ { arr := genRandArr() ret1 := IsTwoTwoPrime1(arr) ret2 := IsTwoTwoPrime2(arr) ret3 := IsTwoTwoPrime3(arr) if ret1 == ret2 && ret1 == ret3 { count++ } fmt.Println(ret1, ret2, ret3, arr) } fmt.Println("总数:", TOTAL) fmt.Println("正确数:", count)}func genRandArr() []int { arrLen := rand.Intn(5) + 5 arr := make([]int, arrLen) for i := 0; i < arrLen; i++ { arr[i] = rand.Intn(1000) + 2 } return arr}func IsTwoTwoPrime1(arr []int) bool { if len(arr) <= 1 { return true } for i := 0; i < len(arr)-1; i++ { for j := i + 1; j < len(arr); j++ { if Gcd(arr[i], arr[j]) > 1 { return false } } } return true}func IsTwoTwoPrime2(arr []int) bool { if len(arr) <= 1 { return true } temp := arr[0] for i := 1; i < len(arr); i++ { if Gcd(temp, arr[i]) > 1 { return false } temp *= arr[i] } return true}func IsTwoTwoPrime3(arr []int) bool { if len(arr) <= 1 { return true } primeSet := make(map[int]struct{}) for i := 0; i < len(arr); i++ { temp := arr[i] primeTempSet := make(map[int]struct{}) for j := 2; j*j <= arr[i]; { if temp%j == 0 { temp /= j primeTempSet[j] = struct{}{} } else { if temp == 1 { break } j += 1 } } if temp != 1 { primeTempSet[temp] = struct{}{} } for primeTemp, _ := range primeTempSet { if _, ok := primeSet[primeTemp]; ok { return false } else { primeSet[primeTemp] = struct{}{} } } } return true}//最大公约数:【辗转相除法】func Gcd(a int, b int) int { //迭代 for b != 0 { a, b = b, a%b } return a}

执行结果如下:

互质

版权声明:
本文内容由互联网用户自发贡献,该文观点仅代表作者本人,因此内容不代表本站观点、本站不对文章中的任何观点负责,内容版权归原作者所有、内容只用于提供信息阅读,无任何商业用途。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站(文章、内容、图片、音频、视频)有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至353049283@qq.com举报,一经查实,本站将立刻删除、维护您的正当权益。
tags:

关于我们

主题百科知识栏目每天分享日常生活小知识,互联为资讯,IT科技百科,家常知识科普等,旨在让大家快乐生活,开心学习,主题百科为您分享!

最火推荐

小编推荐

联系我们


Copyright 帝国主题之家 版权所有 TXT地图 | XML地图 | HTML地图 深圳市南山区海象营销策划工作室 备案号:粤ICP备2020139403号