• 公约数(也叫公因数)|公倍数 |小知识|Golang


    一、最大公约数(也叫公因数)

            两个数的 最大公约数 是能够被两个数整除的最大正整数。

    举例: 3 和 6 的最大公约数是3。“6和3的最大公因数是3。 6的因数有1,2,3,6,3的因数有1,3。两个数的最大公约数是能够被两个数整除的最大整数。

            1071和462的最大公约数(也叫公因数)为21。

            公因数公约数只是叫法上 的区别。两个数的最小公约数为1。

    如何求?

    辗转相除法:

                    以a=1071,b=462为例

                    首先取a,b中的最大值,假设最大值为a。首先用a减去b,一直减,减到当前的a小于b了。即a = 1071-462-462 = 147 < 462。此时我们要用b来减a了,停止条件也是b小于当前的a。那么就是b - a = 462 - 147 - 147 -147 = 21 < a。 现在b = 21,a等于147。我们继续用大的减去小的, 147 - 21 .-.(7个21) - 21 = 0 。 此时这个b即为他俩的最大公约数(公因数)

            落实到编程中咋实现呢?

    1. func gcd(a, b int) int { // 传入两个数
    2. temp := 0 // 用来临时存放a-b的值
    3. for b != 0 { // 终止条件是b==0
    4. temp = a % b // a%b相当于 a一直减b,直到a小于b的时候的值
    5. a = b // 这里为了方便一直用a%b,所以让ab的值互换了。此时的a为两个数中较大的
    6. b = temp // b为 a%b的值
    7. }
    8. return a // 当b==0的时候,也就是temp==0啊,那个时候被减数b就是最大公因子(公约数)
    9. }

    1979. 找出数组的最大公约数

    1. // 1.先找出最大值和最小值
    2. // 2.然后用辗转相除法求得最大公约数就可以了
    3. func findGCD(nums []int) int {
    4. min, max := nums[0], nums[0]
    5. for _, v := range nums {
    6. if v > max {
    7. max = v
    8. }
    9. if v < min {
    10. min = v
    11. }
    12. }
    13. return gcd(max, min)
    14. }
    15. func gcd(a, b int) int {
    16. temp :=0
    17. for b != 0 {
    18. temp = a % b
    19. a,b = b, temp
    20. }
    21. return a
    22. }

     2427. 公因子的数目

    1. func commonFactors(a int, b int) int {
    2. ans := 0
    3. for i:=1;i<=1000;i++{ // 由于数据规模不大,直接遍历
    4. if a % i == 0 && b % i == 0 { // a、b同时可以取模一个数字且余数为0,此时的i就是一个
    5. ans++
    6. }
    7. }
    8. return ans
    9. }

    二、公倍数

            公倍数(common multiple)是指在两个或两个以上的自然数中,如果它们有相同的倍数,这些倍数就是它们的公倍数。公倍数中最小的,就称为这些整数最小公倍数(lowest common multiple)。注意:没有最大公倍数的说法。
            举例:求4和6的最小公倍数。

    解答过程如下: 4=2×2,6=2×3。最小公倍数=2×2×3=12

    如何求两个数的最小公倍数呢?

            我们用:(借助辗转相除法),比较方便,因为前面求公约数就用的辗转相除法,方便一起记忆。

            已知a和b两个数,最小公倍数 = (a*b)/ 最大公约数

            如:4和6的最大公约数是2,那最小公倍数就是(4*6) /  2 = 12。因为两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。

            那么转换成代码就很好写了,把上面的辗转相除法求公约数的函数写出来,然后a*b除以这个公约数就可以咯。

    1. package main
    2. import "fmt"
    3. func main() {
    4. a := 4
    5. b := 6
    6. fmt.Println("4和6的最大公约数为:", gcd(a, b))
    7. fmt.Println("4和6的最小公倍数为:", 1, "两个数的最小公约数不用计算,是1 \n")
    8. // 求a和b的最小公倍数只要 a*b/它俩最大公约数 就可以了
    9. fmt.Println("4和6的最小公倍数为:", a*b/gcd(a, b))
    10. fmt.Println("4和6的最大公倍数为:", "Error:两个数没有最大公倍数(∞)")
    11. }
    12. func gcd(a, b int) int {
    13. temp := 0
    14. for b != 0 {
    15. temp = a % b
    16. a = b
    17. b = temp
    18. }
    19. return a
    20. }
    21. // output
    22. 46的最大公约数为: 2
    23. 46的最小公倍数为: 1 两个数的最小公约数不用计算,是1
    24. 46的最小公倍数为: 12
    25. 46的最大公倍数为: Error:两个数没有最大公倍数(∞)
    26. // 暴力做法
    27. func main() {
    28. // 求4, 6 的最小公倍数
    29. a, b := 4, 6
    30. ans := make([]int, 0)
    31. for i := 0; i < 5; i++ {
    32. ans = append(ans, a)
    33. a += 4
    34. ans = append(ans, b)
    35. b += 6
    36. }
    37. sort.Ints(ans)
    38. for i := 0; i < len(ans)-1; i++ {
    39. if ans[i] == ans[i+1] {
    40. fmt.Println(ans[i])
    41. break
    42. }
    43. }
    44. }

    如何求三个数的最小公倍数呢?

            思路:算了暴力把。

    1. func main() {
    2. // 求6 10 15的最小公倍数
    3. a, b, c := 6, 10, 15
    4. ans := make([]int, 0)
    5. for i := 0; i < 5; i++ {
    6. ans = append(ans, a)
    7. a += 6
    8. ans = append(ans, b)
    9. b += 10
    10. ans = append(ans, c)
    11. c += 15
    12. }
    13. sort.Ints(ans)
    14. for i := 0; i < len(ans)-1; i++ {
    15. if ans[i] == ans[i+1] {
    16. fmt.Println(ans[i])
    17. break
    18. }
    19. }
    20. }

    其它... 算了算了,遇到再说把

  • 相关阅读:
    名城银河湾220㎡5室2厅2厨3卫,精致美学演绎的格调感。福州中宅装饰,福州装修
    数据仓库性能测试方法论与工具集
    vue3前端以json样式输入组件实现
    Apache Doris 快速学习大纲
    Java手写冒泡排序和案例拓展
    服务器是什么 服务器能干什么
    前后端分离&ApiFox(mock数据)&Swagger(后端)
    nodejs获取微信access_token并保存文件
    第二章-Mybatis源码解析-以xml方式走流程
    【JAVA基础】深入解析 ArrayList 和 LinkedList 的区别?
  • 原文地址:https://blog.csdn.net/weixin_42161901/article/details/127619285