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 main

import (
"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
}

执行结果如下:

2021-05-31:怎么判断n个数俩俩互质?比如7,8,9任意两个数最大公约数是1,所以7,8,9两两互质。比如8,9的更多相关文章

  1. 2021.05.03 T3 数字

    2021.05.03 T3 数字 问题描述 一个数字被称为好数字当他满足下列条件: 1. 它有**2*n**个数位,n是正整数(允许有前导0) 2. 构成它的每个数字都在给定的数字集合S中. 3. 它 ...

  2. java 判断两个数是否异号

    java 整型int占4个字节32位,两个数异或后移动31位判断结果,如果是1则异号,如果是0则同号 public class ShowEnviromentViarible { public stat ...

  3. 2021.05.14 tarjan

    2021.05.14 tarjan 标准版tarjan 这里使用数组来模拟栈 void tarjan(int x){ ++ind; dfn[x]=low[x]=ind; stacki[++top]=x ...

  4. for循环练习题(1 ,判断任意一个数是91的多少倍 2,编写程序实现给定一个整数判断它从0到这个整数中间出现多少次9的次数)

    1 //判断任意一个数是9的多少倍 #include <stdio.h> #include <stdlib.h> int main() { printf("请输入任意 ...

  5. http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html深入理解Java:SimpleDateFormat安全的时间格式化

    http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html

  6. 2021.05.09【NOIP提高组】模拟赛总结

    2021.05.09[NOIP提高组]模拟赛总结 T1 T2

  7. Sass函数-comparable 判断两个数是否可进行加减、合并

    comparable() 函数主要是用来判断两个数是否可以进行“加,减”以及“合并”.如果可以返回的值为 true,如果不可以返回的值是 false: >> comparable(2px, ...

  8. 求两个数的最大公约数(Java)

    获得两个随机数(100以内),并放入数组中 public int[] getTwoRandom(){ int[] t = new int[2]; Random rand = new Random(); ...

  9. C实现辗转相除法求两个数的最大公约数

    什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...

  10. 实现pow(int x, int y),即x的y次方 ; 异或交换两个数;

    问题1:实现pow(int x, int y) ,即x的y次方 x的y次方就是有y个x连续乘机,代码如下: #include <stdio.h> #include <stdlib.h ...

随机推荐

  1. Python项目案例开发从入门到实战-1.5Python文件的使用

    Python对文件的操作通常按照三个步骤进行: un 使用open()函数打开(或建立)文件,并返回一个file对象. deux 使用file对象的读写方法对文件进行读写操作. trois 使用fil ...

  2. 初探redis缓存击穿、穿透、雪崩问题

    现分析Redis缓存使用过程失效的一些问题,在有缓存的情况下,查询数据的顺序是先查询缓存,如果查询到数据则直接返回数据,如果没有查询到数据,则到数据库中查询,数据库中有数据的话,将查询出的数据写到缓存 ...

  3. 《MySQL是怎样运行的》第二章小结

  4. sql处理重复的列,更好理清分组和分区

    一.分组统计.分区排名 1.语法和含义: 如果查询结果看得有疑惑,看第二部分-sql处理重复的列,更好理清分组和分区,有建表插入数据的sql语句 分组统计:GROUP BY 结合 统计/聚合函数一起使 ...

  5. SpringBoot笔记--自动配置(高级内容)(下集)

    案例需求 实现步骤: 具体的实现 1.引入Jedis依赖 2.提供Jedis的Bean 找到SpringBoot的执行文件,按住Ctrl键,进入SpringBootApplication注解,再进入E ...

  6. 代码大全_V2(1,2章笔记)

    译序 这本书讲什么 代码大全 原名叫 code complete,它是什么,又不是什么? 不是IDE中的代码自动补全功能 不是软件源代码 "大全" 是 "编码完成&quo ...

  7. Solon2 自定义 slf4j 日志添加器

    本案需要引入已适配的 slf4j 日志框架(solon.logging.simple 或 logback-solon-plugin 或 log4j-solon-plugin). 1.自定义添加器入门 ...

  8. Windows10绿色植物主题Kemikal

    给大家分享一个Windows10的主题,Kemikal主题,内置8张绿色植物树木的壁纸.使用这个主题前需要破解系统主题文件. 想要完整的使用这个主题,需要下载安装下方的三个文件: Windows10主 ...

  9. [C++STL教程]1.vector容器是什么?实用教程来啦!超简单易懂,拿来就用

    C++与传统的C语言有一个很大的区别,就是新增了标准模板库 STL(Standard Template Library),它是 C++ 标准库的一部分,不需要单独安装,只需要 #include 对应的 ...

  10. Object 通用方法

    Object 通用方法 概览 public final native Class<?> getClass() public native int hashCode() public boo ...