十进制转其他进制
关于十进制转换,本站有许多博文。本人喜欢探究各种算法。看到站内半月斩博主写的VB的十进制转换的文章,一个函数DecToN(),就包括了二,八,十六进制的转换。算法很简单,就一个字符表,二个简单的算式,循环计算取得结果 。
我的理解:
字符表:hx$="0123456789ABCDEF" ;
算式:
k=dec-dec/N*N ; //取余 k=dec mod N, k=dec % N
dec=dec/N ; //整除,dec\N
这个思路很奇妙,我喜欢好的思路和好的算法,就用简单的C语言改写了一下。好东西分享给大家供参考,希望大家喜欢。
文后附录原博主的VB代码,博主的名声不能埋没,要张扬一下。
以下是源码:
// **** 十进制转换 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