大概要求:可以顺算和逆算.
顺算后,用类似a=0,b=1,c=2,d=3,e=4,f=5,g=6,h=7,i=8,j=9,k=10=a,l=11=b,m=12=c,n=13=d,o=14=e,p=15=f
达到p后,变进化到aa,ab,ac....ap..这是2位的,再往下,是4位的,6位,8位这样递增.顺算的概念是比如单个字母a,16进制为61,而算出来后是gc,小写b则是62,算出来是gd.
输入gd的时候,可以逆算回b
同时的,输入的可能是中文字,
以下是比较正确的正解
a=61=gc
b=62=gd
.=2E=46=cp
/=2F=47=da
..=2E2E=11822=dcdd
窝=CED1=52945=ncng
我=CED2=52946=ncnh
斡=CED3=52947=ncni
卧=CED4=52948=ncni
握=CED5=52949=ncnk
沃=CED6=52950=ncnl
巫=CED7=52951=ncnm
呜=CED8=52952=ncnn
钨=CED9=52953=ncno
乌=CEDA=52954=ncnp
污=CEDB=52955=ncna污.=CEDB2E=13556526=nhofdj黯=F7F6=63478=aaaaaa
鼢=F7F7=63479=aaabaa痫铐=F0EFEEED=4042256109=aaaaaaaa
痫铑=F0EFEEEE=4042256110=aaaaaaab
珂邋=E7E6E5E5=3890669029=aaaaaaabaa

解决方案 »

  1.   

    补充点...原本是给100分的,按错了.所以....明天再补分.a=61=gc 
    b=62=gd 
    应该表示为
    a=61=97=gc 
    b=62=98=gd 61是16进制,97是10进制.珂邋=E7E6E5E5=3890669029=aaaaaaabaa
    E7E6E5E5是16进制,转到10进制时为3890669029,顺算后为aaaaaaabaa
      

  2.   

    没弄明白~~~~~~
    “a=61=97=gc”:g大概是因为a的Hex第一位是6;可是C呢?好象跟6、1、9、7、61、97都扯不上关系吧!
    “珂邋=E7E6E5E5=3890669029=aaaaaaabaa”, 这个更是一头雾水~~~~~~
    你的“编码规则”看样子也是一种“十六进制”,“珂邋=E7E6E5E5”,顺算后也应该是8个字符的编码呀,怎么变成10个了?再说,你的“aaaaaaabaa”和“3890669029”也对不上号吧!
      

  3.   

    没弄明白~~~~~~
    “a=61=97=gc”:g大概是因为a的Hex第一位是6;可是C呢?好象跟6、1、9、7、61、97都扯不上关系吧!
    “珂邋=E7E6E5E5=3890669029=aaaaaaabaa”, 这个更是一头雾水~~~~~~
    你的“编码规则”看样子也是一种“十六进制”,“珂邋=E7E6E5E5”,顺算后也应该是8个字符的编码呀,怎么变成10个了?再说,你的“aaaaaaabaa”和“3890669029”也对不上号吧!
      

  4.   

    a=61=97=gc这个的规律我大概了解.循环的字母用
    a=0,b=1,c=2,d=3,e=4,f=5,g=6,h=7,i=8,j=9,k=10=a,l=11=b,m=12=c,n=13=d,o=14=e,p=15=f
    g=6,c=2,拼起来减1=61刚好等于gc要理解“珂邋=E7E6E5E5=3890669029=aaaaaaabaa”, 这个更是一头雾水~~~~~~
    要理解这个的话,那得先理解另一个.
    污=CEDB=52955=ncna
    污.=CEDB2E=13556526=nhofdj 
    单个中文字的时候,会变成4位的ncna,但多一个点的时候,会变成6位,好像是重新计算过的.
    所以它们的关系,应该是补位....呵.这就是加密算法嘛..韩国人想的...我现在也要在软件里加一些比较好的加密算法,所以想到它这个.好像还蛮保密的.
      

  5.   

    或者换一种新算法也成.把10进制的无限大的数字,转成26进制的字母(a到z,只要大写或小写)
    10进制和16进制互转,用加减乘除法就可以算,但最大好像只能算到20亿左右.再大就溢出了.比如把数字1换成a,2=b,3=c.....26=z,27=aa...
      

  6.   

    重新说明白一下第1,2贴是原有的加密和解密的,韩国来的,我只有EXE没有过程...
    如果其太过复杂的话...那就来个简单的加密好了.比如已经准备一段数字,8080821234341234233148293.如何把这段数字转换成26进制?或者把26进制的字母转成普通数字?
    用简单的加减乘除法,可以对进制进行转换,但超过20亿的数字后会有问题..
    26进制的话就是用纯大写或小写代替数字,
    1=a
    2=b
    3=c
    4=d
    5=e
    6=f
    7=g
    8=h
    9=i
    ....
    26=z
    27=aa
    28=ab
    29=ac
    .....
    17576=aaa
    17577=aab
    逢26进1,数字消失变成abcdefghij..26个字母代替.而且要支持超大的数字互转..
      

  7.   

    按楼主的所说的26进制,很明显17576并不等aaa啊,应该是17576=aaaa,而且,这个算法肯定不像你想的那样,一次性转换所有数字,而不管这个数字有多少位(所以会导致溢出)。我想它肯定会按一定长度把数字分组后再转换,就像你说的超过20亿后有问题。
      

  8.   

    可以用 Variant/Decimal 子类型,最大可到 79,228,162,514,264,337,593,543,950,335。
    用下面给出的函数取模
    Sub Main()
        Debug.Print Encode("8080821234341234233148293")
    End SubFunction Encode(ByVal s As String) As String
        Dim vDivident   As Variant
        Dim vDivisor    As Variant
        Dim vRemainder  As Variant
        Dim vQuotient   As Variant
        Dim sResult     As String    vDivident = CDec(s)
        vDivisor = CDec(26)
        While vDivident > 0
            vQuotient = BigDiv(vDivident, vDivisor, vRemainder)
            
            sResult = <将余数vRemainder转换成编码格式> & sResult
            
            vDivident = vQuotient
        Wend
        
        Encode = sResult
    End FunctionFunction BigDiv(ByVal Divident As Variant, ByVal Divisor As Variant, ByRef Remainder As Variant) As Variant
        BigDiv = CDec(Int(CDec(Divident) / CDec(Divisor)))
        Remainder = CDec(Divident) - BigDiv * CDec(Divisor)
    End Function
      

  9.   

    其实我觉得不要盯住LZ"支持超大的数字互转"的话不放,简单分个段,随便有多大:可以用String类型,最大受运行电脑硬件限制。 
    用下面给出的函数取模 VB codeSub Main()
        Debug.Print Encode("8080821234341234233148293")
    End SubFunction Encode(ByVal s As String) As String
        Dim vDivident   As long
        Dim vDivisor    As long
        Dim sResult     As String    vDivisor = 26
        While s <>""
            vDivident = left(s,9)
            s=iif(len(s)>9,mid(s,10),"")
            
            do
                sResult= (vDivident mod vDivisor)+97   & sResult
                vDivident =vDivident\vDivisor 
            loop While vDivident<>0
            Encode= Encode & sResult & ","
            sResult=""
        Wend
     End Function套用12L的代码,先谢谢
    LZ在10L的说明还是有问题:0=?,26进制的话26应该进位了,不可能26=z
    上面代码我按a=0,b=1..........z=25做的,还有因为位数不固定所以每组中间加了分隔符","
    LZ根据自己需要改吧
      

  10.   

    Function ec(ByVal s As String) As String
        Dim vDivident  As Long
        Dim vDivisor    As Long
        Dim sResult    As String    vDivisor = 26
        While s <> ""
            vDivident = Left(s, 9)
            s = IIf(Len(s) > 9, Mid(s, 10), "")
            Do
                sResult = Chr((vDivident Mod vDivisor) + 97) & sResult
                vDivident = vDivident \ vDivisor
            Loop While vDivident <> 0
            ec = ec & sResult & ","
            sResult = ""
        Wend
    End Functionec("8080821234341234233148293")=
    cqailtr,bknzukt,gxdgf,
    嘻,逆算怎么写?
      

  11.   

    LS掌柜。
    一切为了加分!
    Function ce(ByVal s As String) As String
        Dim vDivident  As String
        Dim vDivisor    As Long
        Dim sResult    As Long
        Dim i As Long, j As Long
        
        While s <> ""
            i = InStr(1, s, ",")
            vDivident = Left(s, i - 1)
            s = IIf(Len(s) > 1, Mid(s, i + 1), "")
            j = 0
            Do
                vDivisor = 26 ^ j
                sResult = (Asc(Right(vDivident, 1)) - 97) * vDivisor + sResult
                vDivident = Left(vDivident, Len(vDivident) - 1)
                j = j + 1
            Loop While vDivident <> ""
            ce = ce & sResult
            sResult = 0
        Wend
    End Function
      

  12.   

            vDivident = Left(s, i - 1)
    无效的过程调用或参数..
      

  13.   


    你在进入循环前设个断点,先把 S 的值打出来。
    然后,在提示出错时,点“调试”,再在 Debug 窗口中把 s 和 i 的值打出来看一下,就好找原因了。多数情况下是 s 不为空,但不包含 , 。