794. 高精度除法(假设给定两个大数)(可能会出现超时情况)

给定两个非负整数(不含前导 0) A,B,请你计算 A/B的商和余数。

输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤100000,1≤B≤10000,B 一定不为 0
输入样例:
7
2
输出样例:
3
1

package main

import (
	"fmt"
)

func main() {
	var A, B string
	fmt.Scanf("%s\n", &A)
	fmt.Scanf("%s\n", &B)

	a := len(A)
	b := len(B)
	num1 := make([]int, a)
	num2 := make([]int, b)

	for i := 0; i < a; i++ {
		num1[a-i-1] = int(A[i]) - 48
	}
	for i := 0; i < b; i++ {
		num2[b-i-1] = int(B[i]) - 48
	}

	var res []int //商
	var quo []int //余数

	//如果被除数小于除数,则商为0,余数为被除数
	if compare(num1, num2) {
		res, quo = bigDiv(num1, num2)
		for i := len(res) - 1; i >= 0; i-- {
			fmt.Printf("%d", res[i])
		}
		fmt.Printf("\n")

	} else {
		fmt.Println(0)
		quo = num1
	}
	for i := len(quo) - 1; i >= 0; i-- {
		fmt.Printf("%d", quo[i])
	}
}
func bigDiv(num1, num2 []int) ([]int, []int) {

	a := len(num1)
	res := make([]int, a) //商
	quo := make([]int, a) //余数
	var temp []int        //暂存余数

	for i := a - 1; i >= 0; i-- {
		quo = num1[i:] //获取当前被除数
		temp = append(quo[:len(quo)-len(temp)], temp...)
		if compare(temp, num2) {
			//	通过不断地减法确定倍数
			n := 0 //倍数
			for compare(temp, num2) {
				t := 0             //借位标记
				var res_temp []int //暂存差值
				for j := 0; j < len(temp); j++ {
					t = temp[j] - t
					if j < len(num2) {
						t -= num2[j]
					}
					res_temp = append(res_temp, (t+10)%10) //当前余数
					if t < 0 {
						t = 1
					} else {
						t = 0
					}
				}
				n++ //上面的循环每执行一次代表倍数+1
				//	更改被减数的大小,新的被减数变为res_temp
				temp = res_temp
			}
			res[i] = n //直至循环停止,n即为该位上商的值
		} else {
			res[i] = 0
		}
	}

	for len(res) > 1 && res[len(res)-1] == 0 {
		res = res[:len(res)-1]
	}
	for len(temp) > 1 && temp[len(temp)-1] == 0 {
		temp = temp[:len(temp)-1]
	}
	return res, temp
}
func compare(num1, num2 []int) bool {
	for len(num1) > 1 && num1[len(num1)-1] == 0 {
		num1 = num1[:len(num1)-1]
	}
	if len(num1) != len(num2) {
		if len(num1) > len(num2) {
			return true
		} else {
			return false
		}
	} else {
		for i := len(num1) - 1; i >= 0; i-- {
			if num1[i] != num2[i] {
				return num1[i] > num2[i]
			}
		}
	}
	return true
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值