| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | package mainimport (	"fmt"	"strconv")// length < 110, non-negativefunc multiply(num1 string, num2 string) string {	if num1 == "0" || num2 == "0" {		return "0"	}	if num1 == "1" {		return num2	} else if num2 == "1" {		return num1	}	n1 := str2IntSlice(num1)	n2 := str2IntSlice(num2)	sum := []int{}	if len(n1) < len(n2) {		n1, n2 = n2, n1	}	for index, num := range n2 {		product := intSliceMulInt(n1, num)		zeros := make([]int, len(n2)-1-index)		product = append(product, zeros...)		sum = addIntSlice(sum, product)	}	return intSlice2Str(sum)}func str2IntSlice(str string) []int {	res := []int{}	for _, char := range str {		res = append(res, int(char-'0'))	}	return res}func intSlice2Str(slice []int) string {	str := []rune{}	for _, i := range slice {		str = append(str, rune(i+'0'))	}	return string(str)}func addIntSlice(slice1, slice2 []int) []int {	if len(slice1) < len(slice2) {		slice1, slice2 = slice2, slice1	}	if len(slice2) == 0 || (len(slice2) == 1 && slice2[0] == 0) {		return slice1	}	res := make([]int, len(slice1)+1)	carry := 0	for offset := 0; offset < len(slice1); offset++ {		var digit, digit1, digit2 int		if offset < len(slice2) {			digit1 = slice1[len(slice1)-1-offset]			digit2 = slice2[len(slice2)-1-offset]		} else if offset < len(slice1) {			digit1 = slice1[len(slice1)-1-offset]			digit2 = 0		} else {			digit1, digit2 = 0, 0		}		digit, carry = addByDigit(digit1, digit2, carry)		res[len(res)-1-offset] = digit	}	if carry == 0 {		return res[1:]	}	res[0] = carry	return res}func intSliceMulInt(slice []int, num int) []int {	if num == 0 || len(slice) == 0 || (len(slice) == 1 && slice[0] == 0) {		return []int{0}	}	if num == 1 {		return slice	}	res := make([]int, len(slice)+1)	carry := 0	for offset := 0; offset < len(slice); offset++ {		digit := slice[len(slice)-1-offset]		digit, carry = mulByDigit(digit, num, carry)		res[len(res)-1-offset] = digit	}	if carry == 0 {		return res[1:]	}	res[0] = carry	return res}func mulByDigit(digit1, digit2, lastCarry int) (digit, carry int) {	digit = digit1*digit2 + lastCarry	carry = digit / 10	return digit % 10, carry}func addByDigit(digit1, digit2, lastCarry int) (digit, carry int) {	digit = digit1 + digit2 + lastCarry	carry = digit / 10	return digit % 10, carry}func testMultiply(num1 string, num2 string) {	n1, _ := strconv.Atoi(num1)	n2, _ := strconv.Atoi(num2)	fmt.Printf("%s * %s = %s | %d\n", num1, num2, multiply(num1, num2), n1*n2)	slice := str2IntSlice("12347876")	intSlice2Str(slice)}/* func main() {	testMultiply("782", "3908982")} */
 |