用0~9和A~Z实现36进制

本文介绍了一个用于软件开发的36进制数加1的算法实现,该算法能够处理由0-9及A-Z组成的36进制字符串,并通过一系列函数实现了对其的有效操作。

   一个36进制的函数,是在制作一个软件需要时做的,使用10个数字和26个字母组成。
过几天再把进制转数字的代码也贴上来。欢迎各位提意见,以求改进!!

    ''' <summary>
    ''' 36进制数加1,0~9,A~Z
    ''' </summary>
    ''' <param name="value"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Str36Add(ByVal value As ObjectOptional ByVal RetBitNum As Integer = 0As String
        
If value.GetType.Name <> "String" And Not (value Is DBNull.Value) Then
            Str36Add 
= ""
            
MsgBox("参数错误,应为字符型数据或空值。")
            
Exit Function
        
End If
        
If value Is DBNull.Value Then
            Str36Add 
= AddBit("1", RetBitNum, "0")
            
Exit Function
        
End If

        
Dim tmp As String = UCase(Trim(value))
        
Dim i As Integer
        
Dim newtmp As String = ""
        
For i = 1 To Len(tmp)
            
If newtmp <> "" Then
                newtmp 
= newtmp & Mid(tmp, i, 1)
            
Else
                
If Mid(tmp, i, 1<> "0" Then
                    newtmp 
= Mid(tmp, i, 1)
                
End If
            
End If
        
Next
        tmp 
= newtmp
        
If String.IsNullOrEmpty(tmp) Then
            Str36Add 
= AddBit("1", RetBitNum, "0")
            
Exit Function
        
End If
        
If tmp <> "" And Not IsString(tmp) Then
            Str36Add 
= ""
            
MsgBox("错误,非字符串。"16"参数错误")
            
Exit Function
        
End If
        
Dim newstr As String = ""


        
Dim laststr As String = ""
        Str36Add 
= ""
        
Dim addstr As String = ""
        
Dim addvalue As String = ""
        
For i = Len(tmp) To 1 Step -1
            laststr 
= Mid(tmp, i, 1)
            addvalue 
= straddone(laststr)
            
'先判断这位数字是否小于字母“Z”,如不小于则返回值
            If Asc(laststr) < 90 Then
                Str36Add 
= AddBit(Mid(tmp, 1, i - 1& addvalue & addstr, RetBitNum, "0")
                
Exit Function
            
End If
            
If i = 1 Then
                Str36Add 
= AddBit("1" & addvalue & addstr, RetBitNum, "0")
                
Exit Function
            
Else
                addstr 
= addvalue & addstr
            
End If
        
Next
        Str36Add 
= AddBit(Str36Add, RetBitNum, "0")
    
End Function

    
Function AddBit(ByVal OldStr As StringByVal bitnum As IntegerByVal pstr As StringAs String
        AddBit 
= OldStr
        
If bitnum = 0 Then
            
Exit Function
        
End If
        
Dim tmp As String = Left(pstr, 1)
        
If tmp = "" Then
            tmp 
= " "
        
End If
        
Dim i As Integer
        
For i = 1 To bitnum - Len(OldStr)
            AddBit 
= tmp & AddBit
        
Next
    
End Function

    
Function straddone(ByVal value As StringAs String
        
If Asc(value) = 57 Then
            straddone 
= "A"
            
Exit Function
        
End If
        
If Asc(value) = 90 Then
            straddone 
= "0"
            
Exit Function
        
End If
        straddone 
= Chr(Asc(value) + 1)
    
End Function
<think>嗯,用户现在想要在Qt中实现将10进制正数转换为36进制字符串的代码示例。首先,我需要回顾一下之前用户的问题我之前的回答。用户之前问过如何在Python中实现这个转换,而我现在需要将同样的逻辑转换到Qt/C++中。 首先,用户提供的引用内容主要是关于Qt中处理十六进制进制的转换,比如使用QString::number(num, base)方法,以及一些自定义函数处理字符串字节数组的转换。不过,用户现在需要的是36进制,而Qt内置的方法可能不支持36进制,因为QString::number的基数参数通常只支持2到36,但需要确认一下。不过根据之前的Python代码,用户需要的是0-9A-Z的组合,即基数为36。 但是Qt的QString::number函数是否支持基数为36呢?根据Qt的文档,QString::number的第二个参数是基数,范围是2到36,所以应该是支持的。比如,将数字转换为36进制的字符串,可以直接使用QString::number(num, 36)。不过需要注意的是,Qt的QString::number在基数大于10时,使用的是小写字母a-z来表示10到35,而用户可能需要的是大写字母A-Z。这时候就需要将结果转换为大写。 例如,对于数字35,QString::number(35, 36)会得到"z",而用户可能需要的是"Z"。因此,转换后的字符串需要转换为大写。这可能是一个需要注意的地方。 但是用户提供的引用[1]中显示,Qt中使用QString::number(num, 16)得到的是小写的十六进制字符串,而用户可能期望的是大写的,比如在Python代码中的示例输出是"Z""YA"。因此,在Qt中转换后需要将结果转换为大写。 那这样的话,实现步骤应该是这样的: 1. 使用QString::number(num, 36)将十进制数转换为36进制的小写字符串。 2. 将字符串转换为大写,使用toUpper()方法。 3. 处理特殊情况,比如输入为0时直接返回"0"。 但需要测试一下QString::number(0, 36)的结果是否是"0"。如果输入是0,直接返回"0"是正确的。 另外,用户提到的是正数,因此不需要处理负数的情况。之前的Python代码处理了负数,但用户现在明确要求的是正数转换,因此可以省略符号处理部分。 综合以上分析,Qt中的实现代码可能非常简单,只需调用QString::number并转换为大写即可。例如: QString decimalToBase36(int num) { if (num == 0) return "0"; return QString::number(num, 36).toUpper(); } 但需要验证一下这个函数在不同输入下的表现。比如,输入35应该返回"Z",输入36返回"10"。在Qt中,QString::number(35, 36)得到的是"z",转换为大写后是"Z"。QString::number(36, 36)应该是"10",对吗?是的,因为3636进制中是1*36^1 + 0*36^0,所以结果正确。 但还有一个问题,当num为0时,QString::number(0, 36)返回的是"0",所以处理正确。因此这个函数应该可以正常工作。 不过用户之前的Python代码中使用了循环除以36并取余的方法,而这里直接使用内置函数。用户可能希望看到两种实现方式,或者更接近之前的Python逻辑的代码,特别是在Qt中没有内置方法的情况下。但根据引用[1],Qt的QString::number确实支持基数为36,因此直接使用这个方法更简洁。 不过,用户可能需要一个不使用内置函数的实现,比如手动实现转换过程,类似于之前的Python代码。这时候就需要手动处理每个余数,并构建字符串。 例如,手动实现的步骤: 1. 处理0的情况。 2. 循环除以36,记录余数。 3. 将余数转换为对应的字符(0-9,A-Z)。 4. 反转结果字符串。 在Qt中,手动实现的代码可能如下: QString decimalToBase36Manual(int num) { if (num == 0) return "0"; const QString digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; QString result; while (num > 0) { int remainder = num % 36; result.prepend(digits[remainder]); num = num / 36; } return result; } 这里需要注意,prepend的效率可能不高,因为每次都在前面插入字符,而使用QStringList或者QVector来收集字符,最后反转可能更高效。或者使用一个QList<int>存储余数,然后反向构建字符串。 例如: QString decimalToBase36Manual(int num) { if (num == 0) return "0"; const QString digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; QList<int> remainders; while (num > 0) { int remainder = num % 36; remainders.append(remainder); num = num / 36; } std::reverse(remainders.begin(), remainders.end()); QString result; for (int rem : remainders) { result.append(digits[rem]); } return result; } 不过这可能更复杂,但效率可能更高,尤其是在处理大数时。不过对于用户的需求来说,可能更倾向于简洁的代码,特别是如果Qt的内置方法已经满足要求的话。 因此,总结两种方法: 1. 使用Qt内置的QString::number(num, 36).toUpper(),简单高效。 2. 手动实现转换过程,类似于Python代码的逻辑,处理余数并构建字符串。 用户可能需要这两种方法的对比,或者明确说明哪种更好。根据引用内容,用户提供的示例中使用的是Qt内置的转换方法,例如QString::number(num, 16)处理十六进制,所以可能更倾向于推荐使用内置方法,因为它更简洁,并且性能更好。 但需要确认Qt的QString::number在基数为36时是否正确处理所有情况,特别是余数大于等于10的部分是否转换为字母。根据测试,QString::number(10, 36)应该返回"a",转换为大写是"A",符合预期。 因此,最终的Qt实现代码可以非常简洁,直接使用内置函数并转换为大写。同时,也可以提供手动实现的代码,以满足不同的需求,例如在处理极大数字或需要更多控制的情况下。 此外,用户可能关心如何处理大整数,比如超过int范围的数值。在Qt中,可以使用qint64或QString来处理更大的数字,但需要相应的调整代码。不过用户的问题中指定是正数,所以可能不需要处理负数,但需要确认输入的数值范围。 综上所述,Qt中的实现可以有内置方法手动方法两种,推荐使用内置方法,但手动方法可以更直观地展示转换过程,并且可能更灵活,比如处理更大的数值或自定义字符顺序等。</think>#### QT实现10进制36进制字符串方法 根据您提供的引用内容Python实现逻辑,以下是QT/C++的两种实现方式: --- ### 方法一:直接使用QT内置方法(推荐) ```cpp #include <QString> QString decimalToBase36(int num) { if (num == 0) return "0"; return QString::number(num, 36).toUpper(); // 转换为大写字母 } // 测试示例 qDebug() << decimalToBase36(35); // 输出 "Z" qDebug() << decimalToBase36(36); // 输出 "10" ``` **核心原理**: 1. `QString::number(num, 36)` 直接完成36进制转换[^1] 2. `toUpper()` 将小写字母转为大写(QT默认输出小写字母a-z) 3. 时间复杂度:$O(1)$(依赖QT底层实现) --- ### 方法二:手动实现转换过程 ```cpp QString decimalToBase36Manual(qint64 num) { if (num == 0) return "0"; const QString digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; QString result; while (num > 0) { qint64 remainder = num % 36; result.prepend(digits[static_cast<int>(remainder)]); num /= 36; } return result; } ``` **关键改进**: 1. 支持`qint64`大整数范围(-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807) 2. 显式字符映射确保顺序正确 3. 时间复杂度:$O(\log_{36}n)$ --- ### 两种方法对比 | 特性 | 内置方法 | 手动实现 | |--------------------|------------------|------------------| | 代码复杂度 | 简单(1行核心代码)| 中等(需循环处理) | | 性能 | 更高(底层优化) | 较低 | | 字符顺序控制 | 需要额外转大写 | 直接控制映射 | | 大整数支持 | 仅限int范围 | 支持qint64 | --- ### 扩展应用场景 1. **短网址生成**:将自增ID转换为紧凑的36进制字符串[^4] 2. **文件校验码**:生成比16进制更短的唯一标识符 3. **游戏道具编码**:组合类型+等级生成紧凑代码 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值