数学研发网设为首页收藏本站

数学研发论坛

 找回密码
 欢迎注册
查看: 5860|回复: 17

[求助] 关于大数进制转换的问题

[复制链接]
发表于 2008-5-19 08:11:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

x
我现在有一个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;
}
请各位大侠帮帮我吧,
另外建议郭先生把帮助文档写详细一些,最好有函数调用示例程序,那个文档不适合做使用说明,更像是已经掌握这个算法库的程序员的参考手册
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-19 08:32:38 | 显示全部楼层
[img=http://www.emath.ac.cn/image/HugeCalc.gif]Classes and Data Structures[/img]


涉及到进制转换,一般的流程是:
  • 字串转数组,注意数组索引从底到高对应于字串的尾部到头部,得到 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;
  • 如需转换成字串,请自行进行映射转换


其中首尾两步步骤需要用户自己完成(可以获得更自由的控制权)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-19 08:32:58 | 显示全部楼层
来人啊,帮帮我吧,在线等啊,等待的感觉好辛苦啊!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-19 09:21:04 | 显示全部楼层
原帖由 gxqcn 于 2008-5-19 08:32 发表
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是一样的啊,可是我调试发现不是一样的
    毋因群疑而阻独见  毋任己意而废人言
    毋私小惠而伤大体  毋借公论以快私情
    发表于 2008-5-19 09:31:50 | 显示全部楼层
    问题出在你的强制转换方面,
    请将temp修改成UINT32类型,每个元素仅含一个字符--> 数的值。

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

    你原来的那个代码将会修改 v32 的头指针 p_start,在释放空间时会出问题。
    毋因群疑而阻独见  毋任己意而废人言
    毋私小惠而伤大体  毋借公论以快私情
     楼主| 发表于 2008-5-19 09:48:53 | 显示全部楼层
    请问在:
    取得当前 进制转换器 的数组:
    CONST CVECTOR_UINT32& CRadixConverter::GetVector( CVECTOR_UINT32& vU32Num ) CONST;

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

    gxqcn:
    该函数返回的是入参本身,为的是方便写“链式”代码。
    毋因群疑而阻独见  毋任己意而废人言
    毋私小惠而伤大体  毋借公论以快私情
     楼主| 发表于 2008-5-19 10:02:24 | 显示全部楼层
    请问我代码中使用crct初始化大数,以及将大数重新赋值给crct的语句对不对,因为我发现在将大数重新付给crct后,vv32中的字符就不和v32一样了(因为进制相同,他们应该一样),如果将大数重新赋值给crct的语句删除,vv32内容就对了,可这种情况下我再把crct.ResetRadix(36)中的进制改为其他的进制,比如62,而vv32还是和最开始的v32一样,他不是应该变吗?应该出现小写字母才对啊,麻烦你了!
    毋因群疑而阻独见  毋任己意而废人言
    毋私小惠而伤大体  毋借公论以快私情
     楼主| 发表于 2008-5-19 10:26:53 | 显示全部楼层
    唉,我太笨了,都没人理我了....
    毋因群疑而阻独见  毋任己意而废人言
    毋私小惠而伤大体  毋借公论以快私情
    发表于 2008-5-19 10:38:52 | 显示全部楼层
    你性子太急了。

    这是调试好的代码:
    1. #include <iostream>

    2. #include < HugeCalc.h >        // 公共接口
    3. #include < HugeInt.h >        // 10进制系统
    4. #include < HugeIntX.h >        // 16进制系统

    5. #pragma message( "automatic link to HugeCalc.lib" )
    6. #pragma comment( lib, "HugeCalc.lib" )

    7. using namespace std;

    8. void Str2Num( UINT32 * pNum, const char * pStr, const SIZE_T len )
    9. {
    10.         const char * pChar;

    11.         if ( NULL == pNum || NULL == pStr )
    12.                 return;

    13.         pChar = pStr + len;
    14.         while ( pStr != pChar-- )
    15.         {
    16.                 if ( '0' <= *pChar && *pChar < 'A' )
    17.                 {
    18.                         *pNum++ = *pChar - '0';
    19.                 }
    20.                 else if ( 'A' <= *pChar && *pChar <= 'Z' )
    21.                 {
    22.                         *pNum++ = *pChar - 'A' + 10;
    23.                 }
    24.                 else if ( 'a' <= *pChar && *pChar <= 'z' )
    25.                 {
    26.                         *pNum++ = *pChar - 'a' + 36;
    27.                 }
    28.                 else
    29.                 {
    30.                         // other
    31.                 }
    32.         }
    33. }

    34. void Num2Str( char * pStr, const UINT32 * pNum, const SIZE_T len )
    35. {
    36.         const UINT32 * p = pNum + len;
    37.         while ( pNum != p-- )
    38.         {
    39.                 if ( 0 <= *p && *p < 10 )
    40.                 {
    41.                         *pStr++ = '0' + *p;
    42.                 }
    43.                 else if ( 10 <= *p && *p < 36 )
    44.                 {
    45.                         *pStr++ = 'A' + ( *p - 10 );
    46.                 }
    47.                 else if ( 36 <= *p && *p < 62 )
    48.                 {
    49.                         *pStr++ = 'a' + ( *p - 36 );
    50.                 }
    51.                 else
    52.                 {
    53.                         // other
    54.                 }
    55.         }

    56.         *pStr = '\0';
    57. }


    58. int main(int argc, char* argv[])
    59. {
    60.         UINT32 u32Radix = 36;
    61.         UINT32 u32Radix_new = 62;

    62.         char numstr[] = "A190ACDHKMQTWXZ";
    63.         SIZE_T len = strlen( numstr );
    64.         UINT32 * p_start = new UINT32[ len ];

    65.         Str2Num( p_start, numstr, len );

    66.         CVECTOR_UINT32 vU32Num( p_start, len );
    67.         CRadixConverter RadixConverter( u32Radix, SIGN_POS, &vU32Num );
    68.         CHugeIntX HugeVal( RadixConverter );

    69.         RadixConverter.ResetRadix( u32Radix_new );        // 重新设定新的进制
    70.         RadixConverter = HugeVal;                        // 内部快速进制转换

    71.         CVECTOR_UINT32 vU32Num_new;
    72.         RadixConverter.GetVector( vU32Num_new );

    73.         char * pStr = new char[ vU32Num_new.u32Size + 1 ];

    74.         Num2Str( pStr, vU32Num_new.p_start, vU32Num_new.u32Size );

    75.         cout << "通过进制转换器得到的结果:" << pStr << endl;
    76.         cout << "直接通过大数转进制输出为:" << HugeVal.GetStrRadix( u32Radix_new, NULL, FS_NORMAL ) << endl;

    77.         delete []p_start;
    78.         delete []pStr;

    79.         return 0;
    80. }
    复制代码
    毋因群疑而阻独见  毋任己意而废人言
    毋私小惠而伤大体  毋借公论以快私情
     楼主| 发表于 2008-5-19 10:55:02 | 显示全部楼层
    呀,太谢谢了,通过了,完了我再好好研究一下
    谢谢gxqcn,我会经常来捧场的
    毋因群疑而阻独见  毋任己意而废人言
    毋私小惠而伤大体  毋借公论以快私情
    您需要登录后才可以回帖 登录 | 欢迎注册

    本版积分规则

    小黑屋|手机版|Archiver|数学研发网 ( 苏ICP备07505100号  

    GMT+8, 2017-5-1 10:41 , Processed in 0.202094 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表