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