算术基本定理
欧几里得提出并证明:对于任何一个大于 1 的自然数 n,如果 n 不是 质数(素数),那么 n 可以唯一分解成有限个质数的乘积。
该定理名为:Fundamental Theorem of Arithmetic,译为算数基本定理。
该定理的两个要点:存在性与唯一性,即一定存在且唯一。
举例:如 %22%20aria-hidden%3D%22true%22%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-34%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-3D%22%20x%3D%22778%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-32%22%20x%3D%221834%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-D7%22%20x%3D%222557%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-32%22%20x%3D%223558%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3C%2Fg%3E%0A%3C%2Fsvg%3E#card=math&code=4%20%3D%202%20%5Ctimes%202&id=DQi23),
算法实现
思想:因为存在且唯一,所以可以从质因数 2 开始尝试分解 n,若 n / 2 之后是质数,则直接写成两者的乘积;否则继续用 2 对 n / 2 进行分解,直至 n / 2 为质数或者不能再用 2 来分解,继续用 3 来分解,直至最终 n 变为 1 或者质因数都用完了。
小技巧:遍历一个数 n 的所有因数,只需要遍历到
实现:
package mainimport "fmt"func main() {x := 112// 尝试分解质因数for i := 2; i * i <= x; i++ {for x % i == 0 {fmt.Println(i)x /= i}}// 分解后 x 一定是质数fmt.Println(x)}输出:22227
