关于大数进制转换的问题
:( 我现在有一个36进制表示的字符串"A190ACDHKMQTWXZ",想把它转化成62进制,怎么转?我用下面的程序运行不出来,到“CHugeInt HugeResult(crct);”语句时好像没有赋值成功
#include <iostream>
#include "HugeCalc.h" // 公共接口
#include "HugeInt.h" // 10进制系统
#include "HugeIntX.h" // 16进制系统
#pragma message( "automatic link to HugeCalc.lib" )
#pragma comment( lib, "HugeCalc.lib" )
using namespace std;
int main(int argc, char* argv[])
{
std::string lpsznumstr("A190ACDHKMQTWXZ");
CRadixConverter crct(36, lpsznumstr.c_str());
CHugeInt HugeResult(crct);
std::string result(HugeResult.GetStrRadix(36,NULL,FS_DEFAULT,(UINT32)0,NULL));
HugeResult.FreeStrBuffer();
cout<<result.c_str()<<endl;
return 0;
}
请各位大侠帮帮我吧,
另外建议郭先生把帮助文档写详细一些,最好有函数调用示例程序,那个文档不适合做使用说明,更像是已经掌握这个算法库的程序员的参考手册 Classes and Data Structures
涉及到进制转换,一般的流程是:
[*]字串转数组,注意数组索引从底到高对应于字串的尾部到头部,得到 CVECTOR_UINT32 对象
[*]构造 CRadixConverter 对象:
CRadixConverter::CRadixConverter( CONST UINT32 u32Radix, CONST SIGN enumSign = SIGN_POS, CONST LPCVECTOR_UINT32 pVector = NULL )
[*]赋值给大数,CHugeInt 或 CHugeIntX 类型均可(如进制前后均不为10的整数次幂,建议用后者)
[*]修改 进制转换器 的进制:
VOID CRadixConverter::ResetRadix( CONST UINT32 u32Radix )
[*]将大数重新赋值给 进制转换器:
CRadixConverter& CRadixConverter::operator =( CONST CHugeInt& right );
CRadixConverter& CRadixConverter::operator =( CONST CHugeIntX& right );
[*]取得当前 进制转换器 的数组:
CONST CVECTOR_UINT32& CRadixConverter::GetVector( CVECTOR_UINT32& vU32Num ) CONST;
[*]如需转换成字串,请自行进行映射转换
其中首尾两步步骤需要用户自己完成(可以获得更自由的控制权) 来人啊,帮帮我吧,在线等啊,等待的感觉好辛苦啊! 原帖由 gxqcn 于 2008-5-19 08:32 发表 http://images.5d6d.net/dz60/common/back.gif
Classes and Data Structures
涉及到进制转换,一般的流程是:
[*]字串转数组,注意数组索引从底到高对应于字串的尾部到头部,得到 CVECTOR_UINT32 对象
[*]构造 CRadixConverter 对象:
CRadixConverter::C ...
是这样吗:
int main(int argc, char* argv[])
{
std::string lpsznumstr("A190ACDHKMQTWXZ");
const char * temp = reverse(lpsznumstr.c_str(), lpsznumstr.length());//reverse函数我自己写的,是对的
int temp_len = lpsznumstr.length();
CVECTOR_UINT32 v32((const unsigned int *)temp, temp_len);
CRadixConverter crct(36, SIGN_POS, &v32);
CHugeIntX HugeResultX(crct);
crct.ResetRadix(36);
crct = HugeResultX;
CVECTOR_UINT32 vv32 = crct.GetVector(v32);
return 0;
}
因为前后都是36进制,按说这样vv32中的数组和v32是一样的啊,可是我调试发现不是一样的 问题出在你的强制转换方面,
请将temp修改成UINT32类型,每个元素仅含一个字符--> 数的值。
还有,请将CVECTOR_UINT32 vv32 = crct.GetVector(v32);修改为:CVECTOR_UINT32 vv32;
crct.GetVector(vv32);然后读 vv32 里的指针等变量。
你原来的那个代码将会修改 v32 的头指针 p_start,在释放空间时会出问题。 请问在:
取得当前 进制转换器 的数组:
CONST CVECTOR_UINT32& CRadixConverter::GetVector( CVECTOR_UINT32& vU32Num ) CONST;
中,返回值是取得的CVECTOR_UINT32对象对吧?那括号里的参数是什么啊?我用在最前面得到的那个v32作参数,调试到这一步好像被修改了,然后结果就是执行完这一句,vv32和v32一样了,但和最开始的v32是不一样的,而我为了验证,前后都设置的36进制,应该一样啊
gxqcn:
该函数返回的是入参本身,为的是方便写“链式”代码。 请问我代码中使用crct初始化大数,以及将大数重新赋值给crct的语句对不对,因为我发现在将大数重新付给crct后,vv32中的字符就不和v32一样了(因为进制相同,他们应该一样),如果将大数重新赋值给crct的语句删除,vv32内容就对了,可这种情况下我再把crct.ResetRadix(36)中的进制改为其他的进制,比如62,而vv32还是和最开始的v32一样,他不是应该变吗?应该出现小写字母才对啊,麻烦你了! 唉,我太笨了,都没人理我了.... 你性子太急了。
这是调试好的代码:#include <iostream>
#include < HugeCalc.h > // 公共接口
#include < HugeInt.h > // 10进制系统
#include < HugeIntX.h > // 16进制系统
#pragma message( "automatic link to HugeCalc.lib" )
#pragma comment( lib, "HugeCalc.lib" )
using namespace std;
void Str2Num( UINT32 * pNum, const char * pStr, const SIZE_T len )
{
const char * pChar;
if ( NULL == pNum || NULL == pStr )
return;
pChar = pStr + len;
while ( pStr != pChar-- )
{
if ( '0' <= *pChar && *pChar < 'A' )
{
*pNum++ = *pChar - '0';
}
else if ( 'A' <= *pChar && *pChar <= 'Z' )
{
*pNum++ = *pChar - 'A' + 10;
}
else if ( 'a' <= *pChar && *pChar <= 'z' )
{
*pNum++ = *pChar - 'a' + 36;
}
else
{
// other
}
}
}
void Num2Str( char * pStr, const UINT32 * pNum, const SIZE_T len )
{
const UINT32 * p = pNum + len;
while ( pNum != p-- )
{
if ( 0 <= *p && *p < 10 )
{
*pStr++ = '0' + *p;
}
else if ( 10 <= *p && *p < 36 )
{
*pStr++ = 'A' + ( *p - 10 );
}
else if ( 36 <= *p && *p < 62 )
{
*pStr++ = 'a' + ( *p - 36 );
}
else
{
// other
}
}
*pStr = '\0';
}
int main(int argc, char* argv[])
{
UINT32 u32Radix = 36;
UINT32 u32Radix_new = 62;
char numstr[] = "A190ACDHKMQTWXZ";
SIZE_T len = strlen( numstr );
UINT32 * p_start = new UINT32[ len ];
Str2Num( p_start, numstr, len );
CVECTOR_UINT32 vU32Num( p_start, len );
CRadixConverter RadixConverter( u32Radix, SIGN_POS, &vU32Num );
CHugeIntX HugeVal( RadixConverter );
RadixConverter.ResetRadix( u32Radix_new ); // 重新设定新的进制
RadixConverter = HugeVal; // 内部快速进制转换
CVECTOR_UINT32 vU32Num_new;
RadixConverter.GetVector( vU32Num_new );
char * pStr = new char[ vU32Num_new.u32Size + 1 ];
Num2Str( pStr, vU32Num_new.p_start, vU32Num_new.u32Size );
cout << "通过进制转换器得到的结果:" << pStr << endl;
cout << "直接通过大数转进制输出为:" << HugeVal.GetStrRadix( u32Radix_new, NULL, FS_NORMAL ) << endl;
delete []p_start;
delete []pStr;
return 0;
} 呀,太谢谢了,通过了,完了我再好好研究一下
谢谢gxqcn,我会经常来捧场的
页:
[1]
2