给定两个非负整数(不含前导 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
}