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
}