武汉黑人司机:任意进制间有什么简便办法进行转换?

来源:百度文库 编辑:高校问答 时间:2024/04/28 19:05:47
rt

我编的函数,一些变量的定义在外面,没复制进来,用VB写的,希望满意,我自己用者还可以
Private Function jzzh(ByVal s As String, ByVal sfrom As Long, ByVal sto As Long) As String
Dim xsstr As String
Dim zsstr As String
If s = "" Then Exit Function
If Mid(s, 1, 1) = "-" Then
fh = -1
Else
fh = 1
End If
If fh < 0 Then s = Mid(s, 2)
i = 1
Do Until i = Len(s) '去掉非法字符
If getstr(Mid(s, i, 1)) < 0 And Mid(s, i, 1) <> "." Then
s = Mid(s, 1, i - 1) + Mid(s, i + 1)
Else
i = i + 1
End If
Loop
If InStr(1, s, ".") > 0 Then
xsstr = Mid(s, InStr(1, s, ".") + 1)
zsstr = Mid(s, 1, InStr(1, s, ".") - 1)

Else
zsstr = s
xsstr = ""
End If
zscount = Len(zsstr)
xscount = Len(xsstr)
ReDim Preserve zs(1 To zscount) As Long
If xscount > 0 Then ReDim Preserve xs(1 To xscount) As Long
For i = 1 To zscount
zs(i) = getstr(Mid(zsstr, i, 1))
Next i
For i = 1 To xscount
xs(i) = getstr(Mid(xsstr, i, 1))
Next i
zsdat = 0
For i = 1 To zscount
zsdat = zsdat + zs(i) * sfrom ^ (zscount - i)
Next i
xsdat = 0
For i = 1 To xscount
xsdat = xsdat + xs(i) * sfrom ^ (-i)
Next i
zsdats = ""
j = 0
Do Until zsdat < sto
zsdats = getlng(sMod(zsdat, sto)) + zsdats
zsdat = Int(zsdat / sto)
i = i + 1
Loop
zsdats = getlng(sMod(zsdat, sto)) + zsdats
If xscount > 0 Then
i = 0
xsdats = ""
Do Until i > 10
xsdats = xsdats + getlng(Int(xsdat * sto))
xsdat = xsdat * sto - Int(xsdat * sto)

i = i + 1
Loop

i = Len(xsdats)
Do Until Mid(xsdats, i, 1) <> "0"
i = i - 1
Loop
xsdats = Mid(xsdats, 1, i)
Else
xsdats = ""
End If

jzzh = zsdats
If xscount > 0 Then jzzh = jzzh + "." + xsdats
End Function

计算器是一个不错的方法,如果是编程,则可以使用C语言下的itoa函数,原型如下:char* itoa(int value, char* string, int radix),其中value为要转化的十进制数,string为转换后的数,radix为要转换的进制(比如:16进制),radix可以为2~36之间的任意数。要使用这个函数必须包含stdlib.h头文件。
这个函数只能实现十进制到任意进制的转换,要实现任意进制到十进制的转换只有自己写程序了,不过不难,我这里有一个你可以参考参考,不足之处还望指点:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
/*
DecaToElse
十进制到任意进制的转换
iSrc: 待转换的数据
iFlag: 需要转换的进制(比如:十六进制 - 16)
szResult: 返回的结果字符串
返回值:转换之后的结果 否则返回空
*/
char* DecaToElse(int iSrc, int iFlag, char* szResult)
{

int iDiv = iSrc, iMod, i = 0, iTemp;
char* szRet;
char ch;

if(iFlag < 2 || iFlag > 36)
return NULL;

//求数据的位数
if(iDiv == 0)
iTemp = 2;
else iTemp = (int)(log10((float)iSrc) / log10((float)iFlag) + 2);
szRet = (char*)malloc(sizeof(char) * (iTemp + 1));

//为 0 时的处理
if(iDiv == 0){
szRet[i++] = '0';
}

while(iDiv > 0){
iMod = iDiv % iFlag;
if(iMod < 10){
szRet[i++] = iMod + 48;
} else {
szRet[i++] = iMod - 10 + 65;
}
iDiv = iDiv / iFlag;
}
szRet[i] = '\0';

//反转字符串
iMod = strlen(szRet);
iTemp = iMod / 2;
for(i = 0; i < iTemp; i++){
ch = szRet[i];

szRet[i] = szRet[iMod - 1 - i];
szRet[iMod - 1 - i] = ch;
}

if(szResult != NULL)
strcpy(szResult, szRet);
return szRet;
}

/*
ElseToDeca
任意进制到十进制的转换
szTemp: 待转换的数据
iFlag: 待转换数据的进制(比如:十六进制 - 16)
iReturn: 如果函数不成功则返回0,否则返回非0
返回值:转换之后的结果 否则返回0
*/
int ElseToDeca(const char* szTemp, int iFlag, int& iReturn)
{
int iRet = 0;

int len = strlen(szTemp);
char szSrc[33];
iReturn = 1;

if(iFlag < 2 || iFlag > 36 || (szTemp == NULL)){//错误
printf("error 0\n");
iReturn = 0;
return 0;
}

if(strlen(szTemp) == 0){
iReturn = 0;
return 0;
}

strcpy(szSrc, szTemp);
StrToUpper(szSrc);

for(int i = 0; i < len; i++){
if(iFlag <= 10){
if(szSrc[i] >= 48 && szSrc[i] < (48 + iFlag)){
iRet = iRet * iFlag + szSrc[i] - 48;
} else {//错误
iReturn = 0;
return 0;
}
} else {
if(szSrc[i] >= 48 && szSrc[i] < 58){
iRet = iRet * iFlag + szSrc[i] - 48;

} else if(szSrc[i] >=65 && szSrc[i] < (65 + iFlag - 10)){
iRet = iRet * iFlag + szSrc[i] - 65 + 10;

} else {//错误
iReturn = 0;
return 0;
}
}
}
return iRet;
}

/*
StrToUpper
将字符串中的小写字母转换为大写字母
*/
void StrToUpper(char* szSrc)
{
int len = strlen(szSrc);

for(int i = 0; i < len; i++){
if(szSrc[i] >= 'a' && szSrc[i] <= 'z'){
szSrc[i] = szSrc[i] - 32;
}
}
}
有了这几个函数就可以进行任意进制之间的转换了

我是这样算的:
假设原始数据是YS,原始进制是YJ,目标进制是MJ,那么
先将原始数据转变为10进制[把每位数字转化10进制后加和,每位数字=该位数字值*YJ^(第几位-1) ],然后再把10进制的这个数转化为目标进制的数据(原理同转化10进制),这样就行了。

如果你不是指在编程里的话
用附件里的计算器,选科学计算器就很方便

计算器