超大字符串型整数乘除

简介: 超大字符串型整数乘除

之前留了坑,关于超大字符串型整数乘除的问题 还是以加减一文中的a1和a2为例(假设π小数点后50位乘以105010^{50}1050的值为a1,e小数点后30位乘以103010^{30}1030的值为a2),计算a1xa2,以及a1/a2的值

  • 分析,两个数x,y相乘,即(y的个位乘以x) + (y的十位乘以x)乘以10 + ... + (y的最高位乘以x)乘以最高位 之和~
  • 如以1035x287为例,即7x1035 + 8x1035x10 + 2x1035x100,即乘法分配律的变形,1035x(7+80+200)=1035x287
  • //两个数相乘,积的长度不会超过两个数长度之和,如9999x9999=99980001
  • 一个核心点,确定好结果多长有几个坑,想办法设计算法,往坑位写入正确的内容
func main(){
  str1 := "314159265358979323846264338327950288419716939937510"
  str2 :=                     "2718281828459045235360287471352"
  rs := multiply(str1,str2)
  fmt.Println(rs)
}
func multiply(str1, str2 string) string {
  l1, l2 := len(str1), len(str2)
  l := l1 + l2
  num := make([]int, l)
  for i := 0; i < l1; {
    for j := 0; j < l2; {
      num[l-i-j-1] += int(str1[l1-1-i]-'0') * int(str2[l2-1-j]-'0')
      j = j + 1
    }
    i = i + 1
  }
  //上面这段循环是核心,下面和大数加减大致都一样了~
  //从最右往左边,处理进位
  for n := l; n > 1; {
    temp := num[n-1]
    num[n-1] = num[n-1] % 10 //如35/10,得5
    num[n-2] += temp / 10    //如35/10,得3,将3加到上一位
    n = n - 1
  }
  //汇总字符串结果
  res := ""
  for _, i := range num {
    s := strconv.Itoa(i)
    res += s
  }
  //去除开头可能存在的0
  if len(res) > 1 {
    res = strings.TrimLeft(res, "0")
  }
  return res
}

运行结果:

 853973422267356706546355086954449319694770135199398255015274067614534738795213520


目录
相关文章
|
7天前
|
Python
整型数据与字符串类型的数据进行相加
整型数据与字符串类型的数据进行相加。
23 9
|
存储 C语言 C++
C语言之数据的存储2(浮点数在内存中如何存储,如何输出,查看不同类型数据在内存中表示的范围的方法,十进制浮点数转化为二进制的方法)
C语言之数据的存储2(浮点数在内存中如何存储,如何输出,查看不同类型数据在内存中表示的范围的方法,十进制浮点数转化为二进制的方法)
130 0
|
6月前
|
存储
整数和浮点数在内存中存储
整数的2进制表⽰⽅法有三种,即原码、反码和补码。
80 0
|
11月前
|
存储 C语言 C++
整数和浮点数在内存中的存储
整数和浮点数在内存中的存储
90 1
|
6月前
|
存储 编译器 C语言
数据在内存中的存储(浮点数与整数的类型转换)
在c语言操作符那一篇文章中我们讲到整数的二进制表示方法有三种,即原码、反码和补码。 它们都由符号位和数值位组成,数值位中的最高位就是符号位,符号位中0表示”正“,1表示”负“,
|
11月前
|
存储
关于整数和浮点数在内存中的存储的总结
关于整数和浮点数在内存中的存储的总结
74 0
超大字符串型整数加减
超大字符串型整数加减
53 0
|
存储 关系型数据库 MySQL
尽量使用数值替代字符串类型
尽量使用数值替代字符串类型
枚举的三种类型--指数型&排列型&组合型
枚举的三种类型--指数型&排列型&组合型
106 0
|
存储 机器学习/深度学习
求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)
求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)
140 0
求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)