10进制转33进制
1,开始
昨天在CSDN上看到这一个提问帖子:《用SQL写一个存储过程10进制转33进制代码 》,原帖的问题是这样:
急求10进制转33进制代码。
就是我想在SQL中创建一个存储过程“T10TO33”可以实现将10进制的数据转换成33进制。
33进制规则是:1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,V,W,X,Y,Z,0
字母:I、O、U不用,其余正常流水,哪位大神帮忙写一个,谢谢
2.分析
不同进制数据间的转换,记得很久之前写过类似的,参加《X进制与10进制之间的转换》,基本的算法是相同的。
在这里的要求,进制转换中,26个字母中需排除I,O,U三个字母不用,那么原来的X进制与10进制之间转换方法中,就不能直接使用Char()函数。需要对用到的数字和字母重新作个排序,再定位转换。
2.1.初始化一个表变量@tb_tmp,内容如下:
declare @tb_tmp as table(id int identity(0,1) primary key,radix char(1)) ;with cte as (select top (36) row_number() over(order by getdate())-1 as id from sys.columns) insert into @tb_tmp(radix) select case when id>9 then char(55+id) else rtrim(id) end as radix from cte where char(55+id) not in ('I','O','U')
2.2 假设一个10进制的变量@input_int int=50,循环对@input_int除33取模(@input_int%33),得到的模,拿到2.1中的@tb_tmp匹配id,定位到对应的基数radix.即对应到33进制数据位。把得到radix写入变量@output ( @output = 找到的radix + @output)。每次循环,@input_int=@input_int/33,实现10进制拆分。当@input_int=0时,退出循环,返回@output,作为10进制到33进制的结果值。
set @output='' while(1=1) begin select @output=Convert(nvarchar(1024),Case (@input_int%33) when 0 then rtrim(@input_int%33) else (select radix from @tb_tmp where id=@input_int%33) end+@output),@input_int=@input_int/33 if @input_int=0 break end
3.完整代码:
if object_id('T10TO33') Is not null Drop Proc T10TO33 Go create procedure T10TO33( @input_int int, @output nvarchar(1024) output ) as set nocount on declare @tb_tmp as table(id int identity(0,1) primary key,radix char(1)) ;with cte as (select top (36) row_number() over(order by getdate())-1 as id from sys.columns) insert into @tb_tmp(radix) select case when id>9 then char(55+id) else rtrim(id) end as radix from cte where char(55+id) not in ('I','O','U') set @output='' while(1=1) begin select @output=Convert(nvarchar(1024),Case (@input_int%33) when 0 then rtrim(@input_int%33) else (select radix from @tb_tmp where id=@input_int%33) end+@output),@input_int=@input_int/33 if @input_int=0 break end go
4.测试:
declare @reuslt nvarchar(1024) exec T10TO33 0,@reuslt output print @reuslt --0 exec T10TO33 7,@reuslt output print @reuslt --7 exec T10TO33 32,@reuslt output print @reuslt --Z exec T10TO33 33,@reuslt output print @reuslt --10 exec T10TO33 34,@reuslt output print @reuslt --11 exec T10TO33 50,@reuslt output print @reuslt --1H exec T10TO33 99,@reuslt output print @reuslt --30 exec T10TO33 100,@reuslt output print @reuslt --31
(完)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!