parent
ddc939fe45
commit
97674a6368
@ -1,25 +1,25 @@ |
|||||||
package cap3 |
package cap3 |
||||||
|
|
||||||
var _numberTexts = []string{ |
var _numberTexts = []string{ |
||||||
"zero", "one", "two", "three", "four", |
"zero", "one", "two", "three", "four", |
||||||
"five", "six", "seven", "eight", "nine", |
"five", "six", "seven", "eight", "nine", |
||||||
} |
} |
||||||
|
|
||||||
// Ex14NumInput 输入数字,输出英文
|
// Ex14NumInput 输入数字,输出英文
|
||||||
func Ex14NumInput(num uint64, callback func(str string)) { |
func Ex14NumInput(num uint64, callback func(str string)) { |
||||||
digits := make([]uint8, 0, 20) |
digits := make([]uint8, 0, 20) |
||||||
for i := num; i >= 1; i /= 10 { |
for i := num; i >= 1; i /= 10 { |
||||||
digits = append(digits, uint8(i%10)) |
digits = append(digits, uint8(i%10)) |
||||||
} |
} |
||||||
|
|
||||||
for i := len(digits) - 1; i >= 0; i-- { |
for i := len(digits) - 1; i >= 0; i-- { |
||||||
callback(_numberTexts[digits[i]]) |
callback(_numberTexts[digits[i]]) |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
// Ex14StrInput 输入数字字符串,输出英文
|
// Ex14StrInput 输入数字字符串,输出英文
|
||||||
func Ex14StrInput(num string, callback func(str string)) { |
func Ex14StrInput(num string, callback func(str string)) { |
||||||
for _, char := range num { |
for _, char := range num { |
||||||
callback(_numberTexts[char-48]) |
callback(_numberTexts[char-48]) |
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -1,24 +1,24 @@ |
|||||||
package cap3 |
package cap3 |
||||||
|
|
||||||
var ( |
var ( |
||||||
cashes = []int{50, 20, 10, 5, 2, 1} |
cashes = []int{50, 20, 10, 5, 2, 1} |
||||||
) |
) |
||||||
|
|
||||||
// Ex15 最少的纸币找零钱
|
// Ex15 最少的纸币找零钱
|
||||||
func Ex15(amount, paid int) map[int]int { |
func Ex15(amount, paid int) map[int]int { |
||||||
result := map[int]int{} |
result := map[int]int{} |
||||||
|
|
||||||
// 还要找的钱
|
// 还要找的钱
|
||||||
change := paid - amount |
change := paid - amount |
||||||
for i, cash := range cashes { |
for i, cash := range cashes { |
||||||
// 当前面额需要找的张数,整除后结果为0说明当前面额不足以找零
|
// 当前面额需要找的张数,整除后结果为0说明当前面额不足以找零
|
||||||
cashNum := change / cash |
cashNum := change / cash |
||||||
if cashNum != 0 { |
if cashNum != 0 { |
||||||
result[i] = cashNum |
result[i] = cashNum |
||||||
// 当前面额找完后更新剩余未找余额
|
// 当前面额找完后更新剩余未找余额
|
||||||
change = change - cashNum*cash |
change = change - cashNum*cash |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
return result |
return result |
||||||
} |
} |
||||||
|
@ -1,107 +1,107 @@ |
|||||||
package cap3 |
package cap3 |
||||||
|
|
||||||
import ( |
import ( |
||||||
"strings" |
"strings" |
||||||
) |
) |
||||||
|
|
||||||
// Ex18 超长整数乘法(都超长)
|
// Ex18 超长整数乘法(都超长)
|
||||||
func Ex18(a, b string) string { |
func Ex18(a, b string) string { |
||||||
result := make([]uint8, len(a)+len(b)) |
result := make([]uint8, len(a)+len(b)) |
||||||
resultEndIdx := len(result) - 1 |
resultEndIdx := len(result) - 1 |
||||||
for i := 0; i < len(b); i++ { |
for i := 0; i < len(b); i++ { |
||||||
carry := uint8(0) |
carry := uint8(0) |
||||||
aEnd, bEnd, resultIdx := len(a)-1, len(b)-1, 0 |
aEnd, bEnd, resultIdx := len(a)-1, len(b)-1, 0 |
||||||
bDigit := b[bEnd-i] - 48 |
bDigit := b[bEnd-i] - 48 |
||||||
for j := 0; j < len(a); j++ { |
for j := 0; j < len(a); j++ { |
||||||
// 字符转数字
|
// 字符转数字
|
||||||
aDigit := a[aEnd-j] - 48 |
aDigit := a[aEnd-j] - 48 |
||||||
// 当前位计算结果 = 当前结果 + aDigit*bDigit + 进位
|
// 当前位计算结果 = 当前结果 + aDigit*bDigit + 进位
|
||||||
resultIdx = resultEndIdx - (i + j) |
resultIdx = resultEndIdx - (i + j) |
||||||
num := result[resultIdx] + aDigit*bDigit + carry |
num := result[resultIdx] + aDigit*bDigit + carry |
||||||
// 当前位为计算结果的个位,进位为十位上的数字
|
// 当前位为计算结果的个位,进位为十位上的数字
|
||||||
result[resultIdx] = num % 10 |
result[resultIdx] = num % 10 |
||||||
carry = num / 10 |
carry = num / 10 |
||||||
} |
} |
||||||
|
|
||||||
// 如果还有进位,则对下一个结果位添加进位,此时不会再有进位
|
// 如果还有进位,则对下一个结果位添加进位,此时不会再有进位
|
||||||
if carry != 0 { |
if carry != 0 { |
||||||
resultIdx-- |
resultIdx-- |
||||||
result[resultIdx] += carry |
result[resultIdx] += carry |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
zeroPrefix := true |
zeroPrefix := true |
||||||
sb := strings.Builder{} |
sb := strings.Builder{} |
||||||
for _, num := range result { |
for _, num := range result { |
||||||
if zeroPrefix && num == 0 { |
if zeroPrefix && num == 0 { |
||||||
continue |
continue |
||||||
} else { |
} else { |
||||||
zeroPrefix = false |
zeroPrefix = false |
||||||
} |
} |
||||||
|
|
||||||
sb.WriteByte(num + 48) |
sb.WriteByte(num + 48) |
||||||
} |
} |
||||||
|
|
||||||
return sb.String() |
return sb.String() |
||||||
} |
} |
||||||
|
|
||||||
// Ex18type2 超长整数乘法(都超长),a和b都是大端序的数字数组/切片
|
// Ex18type2 超长整数乘法(都超长),a和b都是大端序的数字数组/切片
|
||||||
func Ex18type2(a, b []uint8) []uint8 { |
func Ex18type2(a, b []uint8) []uint8 { |
||||||
result := make([]uint8, len(a)+len(b)) |
result := make([]uint8, len(a)+len(b)) |
||||||
resultEndIdx := len(result) - 1 |
resultEndIdx := len(result) - 1 |
||||||
for i := 0; i < len(b); i++ { |
for i := 0; i < len(b); i++ { |
||||||
carry := uint8(0) |
carry := uint8(0) |
||||||
aEnd, bEnd, resultIdx := len(a)-1, len(b)-1, 0 |
aEnd, bEnd, resultIdx := len(a)-1, len(b)-1, 0 |
||||||
bDigit := b[bEnd-i] |
bDigit := b[bEnd-i] |
||||||
for j := 0; j < len(a); j++ { |
for j := 0; j < len(a); j++ { |
||||||
// 字符转数字
|
// 字符转数字
|
||||||
aDigit := a[aEnd-j] |
aDigit := a[aEnd-j] |
||||||
// 当前位计算结果 = 当前结果 + aDigit*bDigit + 进位
|
// 当前位计算结果 = 当前结果 + aDigit*bDigit + 进位
|
||||||
resultIdx = resultEndIdx - (i + j) |
resultIdx = resultEndIdx - (i + j) |
||||||
num := result[resultIdx] + aDigit*bDigit + carry |
num := result[resultIdx] + aDigit*bDigit + carry |
||||||
// 当前位为计算结果的个位,进位为十位上的数字
|
// 当前位为计算结果的个位,进位为十位上的数字
|
||||||
result[resultIdx] = num % 10 |
result[resultIdx] = num % 10 |
||||||
carry = num / 10 |
carry = num / 10 |
||||||
} |
} |
||||||
|
|
||||||
// 如果还有进位,则对下一个结果位添加进位,此时不会再有进位
|
// 如果还有进位,则对下一个结果位添加进位,此时不会再有进位
|
||||||
if carry != 0 { |
if carry != 0 { |
||||||
resultIdx-- |
resultIdx-- |
||||||
result[resultIdx] += carry |
result[resultIdx] += carry |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
return result |
return result |
||||||
} |
} |
||||||
|
|
||||||
// Ex18type3 超长整数乘法(都超长),a是大端序的数字数组/切片,b为uint64
|
// Ex18type3 超长整数乘法(都超长),a是大端序的数字数组/切片,b为uint64
|
||||||
func Ex18type3(a []uint8, b uint64) []uint8 { |
func Ex18type3(a []uint8, b uint64) []uint8 { |
||||||
result := make([]uint8, len(a)+22) |
result := make([]uint8, len(a)+22) |
||||||
resultEndIdx := len(result) - 1 |
resultEndIdx := len(result) - 1 |
||||||
bOffset := 0 |
bOffset := 0 |
||||||
for i := b; i >= 1; i /= 10 { |
for i := b; i >= 1; i /= 10 { |
||||||
carry := uint8(0) |
carry := uint8(0) |
||||||
bDigit := uint8(i % 10) |
bDigit := uint8(i % 10) |
||||||
aEnd, resultIdx := len(a)-1, 0 |
aEnd, resultIdx := len(a)-1, 0 |
||||||
for j := 0; j < len(a); j++ { |
for j := 0; j < len(a); j++ { |
||||||
// 字符转数字
|
// 字符转数字
|
||||||
aDigit := a[aEnd-j] |
aDigit := a[aEnd-j] |
||||||
// 当前位计算结果 = 当前结果 + aDigit*bDigit + 进位
|
// 当前位计算结果 = 当前结果 + aDigit*bDigit + 进位
|
||||||
resultIdx = resultEndIdx - (bOffset + j) |
resultIdx = resultEndIdx - (bOffset + j) |
||||||
num := result[resultIdx] + aDigit*bDigit + carry |
num := result[resultIdx] + aDigit*bDigit + carry |
||||||
// 当前位为计算结果的个位,进位为十位上的数字
|
// 当前位为计算结果的个位,进位为十位上的数字
|
||||||
result[resultIdx] = num % 10 |
result[resultIdx] = num % 10 |
||||||
carry = num / 10 |
carry = num / 10 |
||||||
} |
} |
||||||
|
|
||||||
// 如果还有进位,则对下一个结果位添加进位,此时不会再有进位
|
// 如果还有进位,则对下一个结果位添加进位,此时不会再有进位
|
||||||
if carry != 0 { |
if carry != 0 { |
||||||
resultIdx-- |
resultIdx-- |
||||||
result[resultIdx] += carry |
result[resultIdx] += carry |
||||||
} |
} |
||||||
|
|
||||||
bOffset++ |
bOffset++ |
||||||
} |
} |
||||||
|
|
||||||
return result |
return result |
||||||
} |
} |
||||||
|
Loading…
Reference in new issue