Наиболее эффективный метод нахождения числа общих факторов двух чисел - PullRequest
0 голосов
/ 11 марта 2019

У меня есть два числа, например, цифры 12 и 16.

факторы 12: 1, 2, 3, 4, 6, 12

множителями 16 являются 1, 2, 4, 8, 16

общими коэффициентами этих двух чисел являются 1, 2 и 4.

Таким образом, число общих факторов3. Мне нужно построить программу Go для поиска чисел, общих для двух чисел.Но программа должна быть эффективной и с минимальным количеством циклов или без циклов.Я предоставлю свой код, а вы также можете внести свой вклад и предложить другие лучшие методы.

package main

import "fmt"

var (
    fs    []int64
    fd    []int64
    count int
)

func main() {
    commonFactor(16, 12)
    commonFactor(5, 10)
}

func commonFactor(num ...int64) {
    count = 0
    if num[0] < 1 || num[1] < 1 {
        fmt.Println("\nFactors not computed")
        return
    }
    for _, val := range num {
        fs = make([]int64, 1)
        fmt.Printf("\nFactors of %d: ", val)
        fs[0] = 1
        apf := func(p int64, e int) {
            n := len(fs)
            for i, pp := 0, p; i < e; i, pp = i+1, pp*p {
                for j := 0; j < n; j++ {
                    fs = append(fs, fs[j]*pp)
                }
            }
        }
        e := 0
        for ; val&1 == 0; e++ {
            val >>= 1
        }
        apf(2, e)
        for d := int64(3); val > 1; d += 2 {
            if d*d > val {
                d = val
            }
            for e = 0; val%d == 0; e++ {
                val /= d
            }
            if e > 0 {
                apf(d, e)
            }
        }
        if fd == nil {
            fd = fs
        }
        fmt.Println(fs)
    }
    for _, i := range fs {
        for _, j := range fd {
            if i == j {
                count++
            }
        }
    }
    fmt.Println("Number of common factors =", count)
}

Вывод:

Факторы из 16: [1 2 4 8 16] Факторыиз 12: [1 2 4 3 6 12]

Количество общих факторов = 3

Факторы 5: [1 5] Факторы 10: [1 2 5 10]

Количество общих факторов = 2

Goplayground

1 Ответ

1 голос
/ 12 марта 2019

Ответ 1, без циклов, только рекурсиябольшие цифры

func factors(n int) []int {
        res := []int{}
        for t := n; t > 0; t-- {
                if (n/t)*t == n {
                        res = append(res, t)
                }
        }
        return res
}

func cf(l1 []int, l2 []int) []int {
        res := []int{}
        for len(l1) > 0 && len(l2) > 0 {
                v1 := l1[0]
                v2 := l2[0]
                if v1 == v2 {
                        res = append(res, v1)
                        l2 = l2[1:]
                }
                if v2 > v1 {
                        l2 = l2[1:]
                } else {
                        l1 = l1[1:]
                }
        }
        return res
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...