十进制转其他进制

十进制转其他进制
关于十进制转换,本站有许多博文。本人喜欢探究各种算法。看到站内半月斩博主写的VB的十进制转换的文章,一个函数DecToN(),就包括了二,八,十六进制的转换。算法很简单,就一个字符表,二个简单的算式,循环计算取得结果 。

 我的理解:
  字符表:hx$="0123456789ABCDEF" ;
  算式:
  k=dec-dec/N*N ;   //取余 k=dec mod N, k=dec % N
  dec=dec/N ;            //整除,dec\N

这个思路很奇妙,我喜欢好的思路和好的算法,就用简单的C语言改写了一下。好东西分享给大家供参考,希望大家喜欢。
文后附录原博主的VB代码,博主的名声不能埋没,要张扬一下。

37b4b699a4ad4f5dba753fef82f9e3a3.png

1e36939a0dcf4ba699834f3ca9b7b422.png 

594e7c46178945948a01f8fbaea38719.png 

 

以下是源码:
// ****  十进制转换  2, 8, 16 进制       **************
// 本代码是用简单的 C 语言写的,用 MySpringC
//  v2.7 编译调试通过。可以 VB6, C++, Java 改写。
// 编译人:张纯叔(micelu@126.com )
//*************************************************
 string sBarDes[10];    //菜单按钮
 int nBarId[10];
 int dec ;     //传入十进制数,N=2,8,16进制
 int N;                //N=2,8,16进制
 string hx$ ;      //N进制值字符表
 int  k;                    //计算
 double m ;            //计算,输入
 string output$;     // 输出结果

main(){
setDisplay (0);
   sBarDes[0]="输入数值";
   nBarId[0]=100;
   sBarDes[1]="开始转换 ";
   nBarId[1]=101;
   sBarDes[2]="设置N进制 ";
   nBarId[2]=102;
   sBarDes[3]="  ";
   nBarId[3]=103;
   sBarDes[4]="退出程序 ";
   nBarId[4]=104;
   setToolBarHeight(10);
   setButtonTextSize(12);
  setToolBarBackgroundColor(255,220,220,220);
   setButtonColor(255,240,240,240);
   setButtonTextColor(255,0,0,200);
   setToolBar(100,myToolBarProc,sBarDes,nBarId,6);
    setTitle("十进制转换"); 
//****
    N=16 ; dec=16777215 ;    //预设置16进制
 while (){}
}//main ()

decToN (){
 //*  input dec  return  bin Oct hex output$
 //输入十进制整数dec,一个预设置字符表hx$就可完成三类进制的转换。
 //最大十进制可计算值 2,147,483,647
  int sd;   //calculate 
  hx$="0123456789ABCDEF" ;
 
    if (dec==0) dec=255 ;  //非0计算 
        sd=dec ;      //print input dec 初值
        output$=" ";     //init输出

 convert :
  //** do calculate until dec=0, return output$
      k=dec-dec/N*N ;    //k=dec Mod N, k=dec % N
      dec=dec/N ;            //整除,dec\N
      output$=subString (hx$, k,1)+output$ ;  
           if (dec>0) goto convert ;

//Do ....
//Loop until dec=0 
     //输出结果:
      print "dec= ", sd ;
      print "转换为", N, "进制" ;
      if (N==2) print "输出结果:  bin=  ",  output$ ;
      if (N==8) print "输出结果:  oct=  ",  output$ ;
      if (N==16) print "输出结果:  hex=  ",  output$ ;
      print "  ";

}//decToN ()

test (){  //测试N进制转换
    clearOutput ();     //清除输出
    dec=255 ;  N=2 ;
       decToN () ;           //开始计算
    dec=255 ;  N=8 ;
       decToN () ;           //开始计算
    dec=255 ;  N=16 ;
       decToN () ;           //开始计算

    dec=248 ;  N=2 ;
       decToN () ;           //开始计算
    dec=248 ;  N=8 ;
       decToN () ;           //开始计算
    dec=248 ;  N=16 ;
       decToN () ;           //开始计算

    dec=723458 ;  N=2 ;
       decToN () ;           //开始计算
    dec=723458 ;  N=8 ;
       decToN () ;           //开始计算
    dec=723458 ;  N=16 ;
       decToN () ;           //开始计算

   dec=16777215 ;  N=2 ;
       decToN () ;           //开始计算
    dec=16777215 ;  N=8 ;
       decToN () ;           //开始计算
    dec=16777215 ;  N=16 ;
       decToN () ;           //开始计算

}//test ()

decInput (){//输入
    m=doubleInput (" 输入十进制非负整数 ","     例: 16777215  \n            输入 [ 空 ]  退出 " ) ;
          clearOutput ();     //清屏
    if (m==0) {  
         print "输入为空,请重新输入。 "  ;     }
        dec=(int)(m);
        print "Input :  十进制整数 = ", dec;
        decToN () ;    //转换
}//decInput ()


Ninput (){//输入
    m=doubleInput (" 设置转为几进制: 2,8,16 ","     例: 16  \n            输入 [ 空 ]  退出 " ) ;
          clearOutput ();    //清屏
    if (m==0) {  
       print "输入为空,请重新输入。 "  ; 
       m=16 ;     }    //容错
    if(m!=2&&m!=8&&m!=16) m=16 ;  //容错
       N=(int)(m);
       print "设置: 转为 n 进制 = ", N;
       decToN () ;    //转换
}//Ninput ()

myToolBarProc(int nBtn,int nContext) {
      if(nBtn==100){//输入十进制整数
            decInput ();           }
      if(nBtn==101){  //test 测试       
             test () ;           }
       if(nBtn==102){//输入转n进制 2, 8, 16
            Ninput ();           }
      if(nBtn==103){//
             // convert () ;    
                    }
      if(nBtn==104){//退出程序
          clearOutput();
          exit (0);            }
}//myToolbar ()

//**** End ****


附录:
本站半月斩博主VB源码
VB将十进制整数转换成16进制以内的任意进制数

'数值转换,能够将十进制整数转换成16进制以内的任意进制数

Private Function DecToN(ByVal x%, ByVal n%) As String

    Dim p() As String, y$, r%

    p = Split("0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F", ",")

    If n > 16 Then

        DecToN = ""

        Exit Function

    End If

    y = ""

    Do

        r = x Mod n

        x = x \ n

        y = p(r) & y

    Loop Until x = 0

    DecToN = y

End Function

Private Sub Command1_Click()

    Dim x%, n%, y$

    x = InputBox("请输入待转换的十进制整数!", "数值转换", 0)

    n = InputBox("请输入需要的进制,注意不要大于16", "数值转换", 2)

    y = DecToN(x, n)

    If y <> "" Then

        MsgBox "转换结果:" & DecToN(x, n)

    Else

        MsgBox "对不起!本程序不能转换超过16的进制!"

    End If

End Sub

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值