Сложение и вычитание целых чисел сверхбольших строк

алгоритм

Диапазон чисел, которые может представлять int64, составляет263прибыть2631-2^{63} до 2^{63}-1, то есть -9223372036854775808~9223372036854775807, (19-битная длина), когда он превышает это число, он переполняется

fmt.Println(9223372036854775808)

执行结果:
constant 9223372036854775808 overflows int

Но когда есть связанные требования, такие как предположение, что 50 знаков после запятой умножаются на105010^{50}значение а1, e Умножьте на 30 знаков после запятой103010^{30}Значение a2, теперь нужно вычислить a1+a2, и значение a1-a2;

То есть для двух положительных или отрицательных строковых целых чисел str1 и str2 вычислить значение str1+str2

1. Когда оба числа целые положительные

например а1+а2

Некоторые необходимые операции, такие как удаление всех нулей слева, не отображаются в коде,

По умолчанию strings.TrimLeft(str, "0") обрабатывается как положительное целое число, которое не начинается с 0.


func main(){
	str1 := "314159265358979323846264338327950288419716939937510"
	str2 :=                     "2718281828459045235360287471352"

	rs := ""
	if len(str1) > len(str2) {
		rs = AddStr(str1,str2)
	}  else{
		rs = AddStr(str2,str1)
	}
	fmt.Println(rs)

}

func AddStr(n1,n2 string)(res string) {
	var num []int
	x,y := len(n1),len(n2)


	num = make([]int,x+1) //因为可能存在两个数的最高位相加大于10的情况,故而比两者中最大数的位数+1

	for i :=0;i<y; {
		num[x-i] = int(n1[x-1-i]-'0') + int(n2[y-1-i]-'0')
		i = i + 1
	}

	for i:=0;i<x-y;{
		num[x-y-i] = int(n1[x-y-i-1]-'0')
		i = i + 1
	}

	//处理进位
	for i := len(num);i>1;{
		if num[i-1]/10==1 {
			num[i-1]-=10
			num[i-2]++
		}
		i = i - 1
	}

	//汇总字符串结果

	for _,i := range num{
		s:=strconv.Itoa(i)
		res+=s
	}

	//去除开头可能存在的0
	if len(res) > 1 {
		res = strings.TrimLeft(res,"0")
	}
	return
}


результат операции:

314159265358979323848982620156409333655077227408862

2. Когда два числа могут быть отрицательными целыми числами

то есть a1-a2, или a2-a1, или -a1-a2

Когда оба числа отрицательны, сначала убирается знак минус, так что это ничем не отличается от сложения двух положительных целых чисел.

Наконец получить результат плюс знак минус;

Когда два числа, одно положительное и одно отрицательное,

Следующий код по умолчанию обрабатывается следующим образом: a1 является положительным, a2 отрицательным, а абсолютное значение a1 > абсолютного значения a2.


func main(){

	str1 := "314159265358979323846264338327950288419716939937510"
	str2 :=                    "-2718281828459045235360287471352"
	str2 = strings.TrimLeft(str2,"-")

	res := subtractStr(str1,str2)

	fmt.Println(res)
}
  
  
func subtractStr(n1,n2 string)(res string) {
  var num []int
  x,y := len(n1),len(n2)

  num= make([]int,x+1)

  for i := 0;i < y; {
  	num[x-i] = int(n1[x-1-i]-'0') - int(n2[y-1-i]-'0')
  	i = i + 1
  }

  for i:=0;i<x-y;{
  	num[x-y-i] = int(n1[x-y-i-1]-'0')
  	i = i + 1
  }

  //处理进位
  for i := len(num);i>1;{
  	if num[i-1] < 0  {
  		num[i-1]+=10
  		num[i-2]--
  	}
  	i = i- 1
  }

  //汇总字符串结果

  for _,i := range num{
  	s:=strconv.Itoa(i)
  	res+=s
  }

  //去除开头可能存在的0
  if len(res) > 1 {
  	res = strings.TrimLeft(res,"0")
  }
  return
}



результат операции:

 314159265358979323843546056499491243184356652466158


Мысль 1: Когда str1 и str2 не обязательно являются целочисленными строками, но могут быть десятичными числами, как с ними работать?

Мысль 2: Как справиться с умножением и делением сверхбольших целых строк