题解 | 质数因子

质数因子

https://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607?tpId=37&tqId=21229&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D2%26tpId%3D37%26type%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=&dayCountBigMember=365%E5%A4%A9

package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"strconv"
)

func getPrimeFactor(num int) []int {
    var resSlice []int
    if num <= 2 {
        return []int{num}
    } else {
        originNum := num
        for i := 2; i <= int(math.Sqrt(float64(originNum))); i++ {
            if num % i == 0 {
                for {
                    if num % i == 0 {
                        resSlice = append(resSlice, i)
                        num = num / i
                    } else {
                        break
                    }
                }
                 
            }
            
        }
        if num > 1 {
            resSlice = append(resSlice, num)
        }
        // 一种极端情况,非常大的质数,只有一个数字
        if resSlice == nil {
            resSlice = []int{num}
        }
    }
    return resSlice
}

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    if scanner.Scan() {
        var input int
        input, err := strconv.Atoi(scanner.Text())
        if err != nil {
            fmt.Println(err)
        }
        res := getPrimeFactor(input)
        for _, v := range res {
            fmt.Printf("%d ", v)
        }
    }
    
}

判断一个质数是否能够组成数字n的质因子的方法就是直接计算余数是否为0,若为0表示是质因子,因此直接取模运算即可。但如果最大数判断为n本身,对于很多测试用例会超时,因此可以判断到根号n,如果还剩余了大于1的未被分解的数,那么这个数就是最后一个质因子。原理是按理说枚举到某个数时能够得到a * b = n,a<b,那么必然存在a*a<n,也就是说只要平方超过n,那么就是最大的数,除非本身就是一个质数,推断如下:

假设n是一个正整数,并且存在两个正整数 a 和 b ,使得n = a * b。不妨设 a < b,那么有a * a < a* b = n ,即 a^2 = n ,进一步可得 a = √n ̄

这意味着如果n有一个大于 √n ̄ 的因子b,那么必然存在一个小于等于√n ̄的因子a与之对应,因为 n = a*b 。所以,我们在寻找n 的质因子时,只需要检查从2到√n ̄(向下取整)的所有整数即可。如果在这个范围内没有找到n 的因子,那么 n本身就是一个质数。

全部评论

相关推荐

徐新高:号已经废了 建议重开一个账号投简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务