Multiplication by large numbers
需求
求n的阶乘(0<n<1000)
示例
输入:
2
3
输出:
2
6
解题思路
普通的数据类型肯定没法承载精确的大数的阶层,所以这实际就是一个大数相乘算法
- 用一个数组来装大数的每一位
- 用数组的每一个值去乘被乘数
- 将数组从后往前进位然后留值,因为数字相邻两位相差10的倍数,就以10进1,例如数组最后一位为102,则向前进10,留2
- 最后顺序打出不换行的数组每个值就是结果,需要注意的是数组的长度
func multiplication(largeNumber [1000]int, number int) [1000]int {
for i := 0; i < len(largeNumber); i++ {
largeNumber[i] = largeNumber[i] * number
}
for i := len(largeNumber) - 1; i > 0; i-- {
// 进位
largeNumber[i-1] = largeNumber[i]/10 + largeNumber[i-1]
// 留值
largeNumber[i] = largeNumber[i] % 10
}
return largeNumber
}
完整实现
package main
import (
"fmt"
"os"
)
func main() {
for {
var num int
var largeNumber [1000]int
n, err := fmt.Scanf("%d", &num)
if n != 1 || err != nil {
os.Exit(1)
}
// 最后一位给1
largeNumber[len(largeNumber)-1] = 1
for i := 1; i <= num; i++ {
largeNumber = multiplication(largeNumber, i)
}
// 数组中不为0的第一个数
min := 0
for i := 0; i < len(largeNumber); i++ {
if largeNumber[i] != 0 {
min = i
break
}
}
for i := min; i < len(largeNumber); i++ {
fmt.Print(largeNumber[i])
}
fmt.Println()
}
}
func multiplication(largeNumber [1000]int, number int) [1000]int {
for i := 0; i < len(largeNumber); i++ {
largeNumber[i] = largeNumber[i] * number
}
for i := len(largeNumber) - 1; i > 0; i-- {
// 进位
largeNumber[i-1] = largeNumber[i]/10 + largeNumber[i-1]
// 留值
largeNumber[i] = largeNumber[i] % 10
}
return largeNumber
}