【基础入门题】Golang 003. 分解阶乘的质因数
分解 n! 的质因数,写成连乘的样式,因数多于一个用^m表示个数。
如:Factor(6) = 2^4x3^2x5; Factor(8) = 2^7x3^2x5x7
方法一:
package main import ( "fmt" "strconv" ) func Factorial(n int) int { result := 1 for i := 1; i <= n; i++ { result *= i } return result } func Factor(n int) string { result := "" n = Factorial(n) for i := 2; i <= n; i++ { count := 0 for n%i == 0 { count++ n /= i } if count > 0 { if count == 1 { result += "x" + strconv.Itoa(i) } else { result += "x" + strconv.Itoa(i) + "^" + strconv.Itoa(count) } } } return result[1:] } func main() { fmt.Printf("Factor(%d) = %s\n", 6, Factor(6)) fmt.Printf("Factor(%d) = %s\n", 8, Factor(8)) }
方法二:
package main import ( "fmt" "strconv" ) func Factorial(n int) int { result := 1 for i := 1; i <= n; i++ { result *= i } return result } func Factor(n int) string { result := "" n = Factorial(n) for i := 2; i <= n; i++ { count := 0 for n%i == 0 { count++ n /= i if count == 1 { result += "x" + strconv.Itoa(i) } } if count > 1 { result += "^" + strconv.Itoa(count) } } return result[1:] } func main() { fmt.Printf("Factor(%d) = %s\n", 6, Factor(6)) fmt.Printf("Factor(%d) = %s\n", 8, Factor(8)) fmt.Printf("Factor(%d) = %s\n", 10, Factor(10)) /* Out: Factor(6) = 2^4x3^2x5 Factor(8) = 2^7x3^2x5x7 Factor(10) = 2^8x3^4x5^2x7 */ }
方法三:【优化】合并阶乘函数、减少循环次数
package main import ( "fmt" "strconv" ) func Factor(m int) string { n := 1 for i := 1; i <= m; i++ { n *= i } result := "" for i := 2; i <= m; i++ { count := 0 for n%i == 0 { count++ n /= i if count == 1 { result += "x" + strconv.Itoa(i) } } if count > 1 { result += "^" + strconv.Itoa(count) } } return result[1:] } func main() { fmt.Printf("Factor(%d) = %s\n", 6, Factor(6)) fmt.Printf("Factor(%d) = %s\n", 8, Factor(8)) fmt.Printf("Factor(%d) = %s\n", 10, Factor(10)) /* Out: Factor(6) = 2^4x3^2x5 Factor(8) = 2^7x3^2x5x7 Factor(10) = 2^8x3^4x5^2x7 */ }
方法四: 使用数组,追加后连接
package main import ( "fmt" "strconv" "strings" ) func Factor(m int) string { n := 1 res := []string{} for i := 1; i <= m; i++ { n *= i } for i := 2; i <= m; i++ { count := 0 for n%i == 0 { count++ n /= i } if count == 1 { res = append(res, strconv.Itoa(i)) } else if count > 1 { res = append(res, strconv.Itoa(i)+"^"+strconv.Itoa(count)) } } return strings.Join(res, "x") } func main() { fmt.Printf("Factor(%d) = %s\n", 6, Factor(6)) fmt.Printf("Factor(%d) = %s\n", 8, Factor(8)) fmt.Printf("Factor(%d) = %s\n", 10, Factor(10)) }
方法五:使用bytes.Buffer
package main import ( "fmt" "bytes" "strconv" ) func Factor(m int) string { var n int = 1 var buf bytes.Buffer for i := 1; i <= m; i++ { n *= i } for i := 2; i <= m; i++ { count := 0 for n%i == 0 { count++ n /= i if count == 1 { buf.WriteString("x" + strconv.Itoa(i)) } } if count > 1 { buf.WriteString("^" + strconv.Itoa(count)) } } result := buf.String() return result[1:] } func main() { fmt.Printf("Factor(%d) = %s\n", 6, Factor(6)) fmt.Printf("Factor(%d) = %s\n", 8, Factor(8)) fmt.Printf("Factor(%d) = %s\n", 10, Factor(10)) }
方法六:和方法五类似,使用strings.Builder
package main import ( "fmt" "strings" "strconv" ) func Factor(m int) string { var n int = 1 var buf strings.Builder for i := 1; i <= m; i++ { n *= i } for i := 2; i <= m; i++ { count := 0 for n%i == 0 { count++ n /= i if count == 1 { buf.WriteString("x" + strconv.Itoa(i)) } } if count > 1 { buf.WriteString("^" + strconv.Itoa(count)) } } result := buf.String() return result[1:] } func main() { fmt.Printf("Factor(%d) = %s\n", 6, Factor(6)) fmt.Printf("Factor(%d) = %s\n", 8, Factor(8)) fmt.Printf("Factor(%d) = %s\n", 10, Factor(10)) }