zoukankan      html  css  js  c++  java
  • 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

    (完)

  • 相关阅读:
    Xshell如何配置并远程连接Linux服务器详解
    VMware如何克隆一个虚拟机
    如何通过VMware安装Linux CentOS 7.7系统
    如何VMware创建Linux虚拟机并设置虚拟机网络
    自动化运维工具Ansible之LNMP实践环境部署
    自动化运维工具Ansible之Roles角色详解
    自动化运维工具Ansible之Tests测验详解
    Ansible Jinja2 模板使用
    Ansible playbook Vault 加密
    Ansible playbook 编程
  • 原文地址:https://www.cnblogs.com/wghao/p/6381865.html
Copyright © 2011-2022 走看看