Golang中Printnbrbase.go的实现与使用
Golang中Printnbrbase.go的实现与使用 大家好,我在代码中遇到了一些问题。我想尝试编写一个代码,它能根据传入的参数字符串基数来打印一个整数。
如果基数无效,函数会打印 NV(表示无效)。
我设定了一些有效性规则:
- 基数必须至少包含 2 个字符。
- 基数中的每个字符必须是唯一的。
- 基数不应包含
+或-字符。
我只是想知道如何检测基数,因为当基数是一个字符串并且像 “choumi” 这样开头时,我应该如何检测它呢?
7 回复
你好,很抱歉,但我真的很难理解你需要什么。
你有示例数据吗?
更多关于Golang中Printnbrbase.go的实现与使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好 @Seiya-Araz_seiya380,欢迎加入社区。
你有代码可以展示吗?通常我会选择使用正则表达式,但这取决于你的需求。
问题在于这只是一个示例,有时我得到的基础字符串是“hello”,而最近一次我得到的是“qwerty”,并且我不知道我的练习有多少个基础字符串。所以,我真的需要帮助。
我刚拿到这个起始代码:
package piscine
func PrintNbrBase(nbr int, base string) {
}
并且我知道我的程序将用以下示例返回这些结果:
package main
import (
"github.com/01-edu/z01"
"piscine"
)
func main() {
piscine.PrintNbrBase(125, "0123456789")
z01.PrintRune('\n')
piscine.PrintNbrBase(-125, "01")
z01.PrintRune('\n')
piscine.PrintNbrBase(125, "0123456789ABCDEF")
z01.PrintRune('\n')
piscine.PrintNbrBase(-125, "choumi")
z01.PrintRune('\n')
piscine.PrintNbrBase(125, "aa")
z01.PrintRune('\n')
}
以及其输出:
$ go run .
125
-1111101
7D
-uoi
NV
$
根据我的理解:
- 获取基数参数的长度。这是用于编码数字
nbr的基数。 - 反复进行除法运算,直到商小于基数,并取每次除法的余数。这些余数就是基数字符串中字符的索引。
以下是一些代码…
func validateBase(base string) bool {
// 基数必须至少包含2个字符。
if len(base) < 2 {
return false
}
// 基数的每个字符必须是唯一的。
m := make(map[rune]int)
for _, ch := range base {
// 基数不应包含 + 或 - 字符。
if ch == '+' || ch == '-' {
return false
}
if _, ok := m[ch]; ok {
m[ch] = m[ch] + 1
if m[ch] > 1 {
return false
}
} else {
m[ch] = 1
}
}
return true
}
func PrintNbrBase(nbr int, base string) string {
str := ""
baseNumber := len(base)
isNegative := false
if !validateBase(base) {
return "NV"
}
if nbr < 0 {
isNegative = true
nbr = -1 * nbr
}
for {
c, r := nbr/baseNumber, nbr%baseNumber
str = string(base[r]) + str
if c < baseNumber {
str = string(base[c]) + str
break
}
nbr = c
}
if isNegative {
str = "-" + str
}
return str
}
在Golang中实现Printnbrbase功能时,检测基数有效性的关键在于字符串处理和字符唯一性检查。以下是一个完整的实现示例:
package main
import (
"fmt"
)
func PrintNbrBase(n int, base string) {
// 检查基数有效性
if !isValidBase(base) {
fmt.Print("NV")
return
}
// 处理负数
if n < 0 {
fmt.Print("-")
n = -n
}
// 转换并打印数字
baseLen := len(base)
if n == 0 {
fmt.Print(string(base[0]))
return
}
// 递归打印
printRecursive(n, base, baseLen)
}
func printRecursive(n int, base string, baseLen int) {
if n == 0 {
return
}
printRecursive(n/baseLen, base, baseLen)
fmt.Print(string(base[n%baseLen]))
}
func isValidBase(base string) bool {
// 规则1: 基数必须至少包含2个字符
if len(base) < 2 {
return false
}
// 规则2: 基数中的每个字符必须是唯一的
seen := make(map[rune]bool)
for _, char := range base {
// 规则3: 基数不应包含 '+' 或 '-' 字符
if char == '+' || char == '-' {
return false
}
if seen[char] {
return false
}
seen[char] = true
}
return true
}
func main() {
// 测试有效基数
fmt.Print("测试1 (十进制): ")
PrintNbrBase(123, "0123456789")
fmt.Println()
fmt.Print("测试2 (二进制): ")
PrintNbrBase(42, "01")
fmt.Println()
fmt.Print("测试3 (自定义基数): ")
PrintNbrBase(255, "0123456789ABCDEF")
fmt.Println()
fmt.Print("测试4 (自定义字符串基数): ")
PrintNbrBase(42, "choumi")
fmt.Println()
// 测试无效基数
fmt.Print("测试5 (重复字符): ")
PrintNbrBase(123, "01234567890") // 0重复
fmt.Println()
fmt.Print("测试6 (包含+号): ")
PrintNbrBase(123, "012+456789")
fmt.Println()
fmt.Print("测试7 (包含-号): ")
PrintNbrBase(123, "012-456789")
fmt.Println()
fmt.Print("测试8 (长度不足): ")
PrintNbrBase(123, "0")
fmt.Println()
// 测试负数
fmt.Print("测试9 (负数): ")
PrintNbrBase(-123, "0123456789")
fmt.Println()
// 测试零
fmt.Print("测试10 (零): ")
PrintNbrBase(0, "0123456789")
fmt.Println()
}
对于你提到的"choumi"这样的字符串基数,检测逻辑如下:
- 长度检查:
len("choumi") = 6,满足至少2个字符的要求 - 字符唯一性检查:
- 遍历"c", “h”, “o”, “u”, “m”, “i”
- 使用map记录已出现的字符
- 所有字符都是唯一的
- 特殊字符检查:字符串中不包含’+‘或’-’
因此"choumi"是一个有效的基数。当使用这个基数时:
- 数字0表示为"c"
- 数字1表示为"h"
- 数字2表示为"o"
- 数字3表示为"u"
- 数字4表示为"m"
- 数字5表示为"i"
- 数字6表示为"ch"(因为6 = 1*6 + 0)
- 以此类推
例如PrintNbrBase(42, "choumi")会输出"hmc",因为:
- 42 ÷ 6 = 7 余数 0 → “c”
- 7 ÷ 6 = 1 余数 1 → “h”
- 1 ÷ 6 = 0 余数 1 → “h”
- 结果是"hhc"(从最后一个余数开始读取)


