leedcode_大数相减

8 篇文章 0 订阅
  • 描述

两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如 Java.math.BigInteger 等。

  • 输入

有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位。规定 a>=b,a, b > 0。
测试结果可以用 linux 小工具 bc进行测试是否正确。

  • 输出

返回表示结果整数的字符串

输入样例
1231231237812739878951331231231237812739878951331231231237812739878951331231231237812739878951331231231237812739878951331231231237812739870 - 89513312312312378127398789513312312312378127398789513312312312378127398789513

1231231237812739878951331231231237812739878951331231231237812739878951331230000000000000000000000001 - 331231231237812739878951331231231
输出样例
1231231237812739878951331231231237812739878951331231231237812650365639018918853110413950365639018918853110413950365639018918853110413950357

1231231237812739878951331231231237812739878951331231231237812739878620099998762187260121048668768770         
  • go实现

思路

将大数拆成单个的整数进行相减,其中要考虑借位还有两个数的长度不一致问题

package main
import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)
func solution3(line string) string {
	 在此处理单行数据
	if strings.Contains(line, " ") {
		line = strings.Replace(line, " ", "", -1)
	}
	strArray := strings.Split(line, "-")
	println(len(strArray[0]) - len(strArray[1]))
	str1, str2 := HandleSame(strArray[0], strArray[1])
	var r string
	var y int
	var result string
	for i := len(str1); i > 0; i-- {
		strA := string([]byte(str1)[i-1 : i])
		strB := string([]byte(str2)[i-1 : i])
		y, r = Reduce(strA, strB, y)
		result = r + result
	}
	return result
}
//考虑两个大数的长度不一样
func HandleSame(str1 string, str2 string) (string, string) {
	len := len(str1) - len(str2)
	if len == 0 {
		return str1, str2
	} else {
		for i := 0; i < len; i++ {
			str2 = "0" + str2
		}
	}
	return str1, str2
}
//每位相加减,考虑借位
func Reduce(a string, b string, c int) (d int, e string) {
	s1, _ := strconv.Atoi(a)
	s2, _ := strconv.Atoi(b)
	r := s1 - s2 + c
	if r < 0 {
		r = r + 10
		d = -1
	}
	return d, fmt.Sprintf("%v", r)
}
func main() {
	r := bufio.NewReaderSize(os.Stdin, 20480)
	for line, _, err := r.ReadLine(); err == nil; line, _, err = r.ReadLine() {
		fmt.Println(solution3(string(line)))
	}
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值