chyschy 发表于 2008-5-19 08:11:47

关于大数进制转换的问题

:( 我现在有一个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;
}
请各位大侠帮帮我吧,
另外建议郭先生把帮助文档写详细一些,最好有函数调用示例程序,那个文档不适合做使用说明,更像是已经掌握这个算法库的程序员的参考手册

gxqcn 发表于 2008-5-19 08:32:38

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;

[*]如需转换成字串,请自行进行映射转换

其中首尾两步步骤需要用户自己完成(可以获得更自由的控制权)

chyschy 发表于 2008-5-19 08:32:58

来人啊,帮帮我吧,在线等啊,等待的感觉好辛苦啊!

chyschy 发表于 2008-5-19 09:21:04

原帖由 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是一样的啊,可是我调试发现不是一样的

gxqcn 发表于 2008-5-19 09:31:50

问题出在你的强制转换方面,
请将temp修改成UINT32类型,每个元素仅含一个字符--> 数的值。

还有,请将CVECTOR_UINT32 vv32 = crct.GetVector(v32);修改为:CVECTOR_UINT32 vv32;
crct.GetVector(vv32);然后读 vv32 里的指针等变量。

你原来的那个代码将会修改 v32 的头指针 p_start,在释放空间时会出问题。

chyschy 发表于 2008-5-19 09:48:53

请问在:
取得当前 进制转换器 的数组:
CONST CVECTOR_UINT32& CRadixConverter::GetVector( CVECTOR_UINT32& vU32Num ) CONST;

中,返回值是取得的CVECTOR_UINT32对象对吧?那括号里的参数是什么啊?我用在最前面得到的那个v32作参数,调试到这一步好像被修改了,然后结果就是执行完这一句,vv32和v32一样了,但和最开始的v32是不一样的,而我为了验证,前后都设置的36进制,应该一样啊

gxqcn:
该函数返回的是入参本身,为的是方便写“链式”代码。

chyschy 发表于 2008-5-19 10:02:24

请问我代码中使用crct初始化大数,以及将大数重新赋值给crct的语句对不对,因为我发现在将大数重新付给crct后,vv32中的字符就不和v32一样了(因为进制相同,他们应该一样),如果将大数重新赋值给crct的语句删除,vv32内容就对了,可这种情况下我再把crct.ResetRadix(36)中的进制改为其他的进制,比如62,而vv32还是和最开始的v32一样,他不是应该变吗?应该出现小写字母才对啊,麻烦你了!

chyschy 发表于 2008-5-19 10:26:53

唉,我太笨了,都没人理我了....

gxqcn 发表于 2008-5-19 10:38:52

你性子太急了。

这是调试好的代码:#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;
}

chyschy 发表于 2008-5-19 10:55:02

呀,太谢谢了,通过了,完了我再好好研究一下
谢谢gxqcn,我会经常来捧场的
页: [1] 2
查看完整版本: 关于大数进制转换的问题