发表于 2019-10-18 15:19

申请会员ID:gxup320

1、 申 请 I D:gxup320
2、 个人邮箱:gxup320@outlook.com
3、 原创技术文章:进制转换算法
注:该文章为原创,之前发布在CSDN,作论坛申请用。
进制转换算法
转换流程:
http://gxup320.320.io:320/bbsfile/forum/201908/03/122425fcckoq3c9b3ysc2p.png   
进制转C++代码示例
#include <iostream>
#include <string>
void base_conversion(const char* source, int source_base, char** aims_return, int aims_base)
{
        char* aims = NULL;
        int source_length = strlen(source);
        int* data = (int*)malloc(source_length * sizeof(int));
        int temp;
        for (int i = 0; i < source_length; i++)
        {
                if (source >= 'A' && source <= 'Z')
                {
                        data = source - 'A' + 10;
                }
                else if (source >= 'a' && source <= 'z')
                {
                        data = source - 'a' + 10;
                }
                else
                {
                        data = source - '0';
                }
        }
        int sum, d;
        int* output = NULL, k = 0;
        do
        {
                sum = 0;
                for (int i = 0; i < source_length; i++)
                {
                        d = data / aims_base;
                        sum += d;
                        if (i == source_length - 1)
                        {
                                output = (int*)realloc(output, (k + 1) * sizeof(int));
                                output = data % aims_base;
                                k++;
                        }
                        else
                        {
                                data += (data % aims_base) * source_base;
                        }
                        data = d;
                }
        } while (sum);
        aims = (char*)malloc((k + 1) * sizeof(char));
        aims = '\0';
        for (int i = 0; i < k; i++)
        {
                if (output > 9)
                {
                        aims = output + 'A' - 10;
                }
                else
                {
                        aims = output + '0';
                }
        }
        *aims_return = aims;
        if (data != NULL)
        {
                free(data);
        }
}

int main()
{
        int source_base = 0;
        std::cout << "输入原进制:";
        std::cin >> source_base;
        while (getchar() != 10);//清空输入缓冲区
        std::cout << "输入数值:";
        std::string str;
        std::cin >> str;
        char* data = NULL;
        for (int i = 2; i <= 36; i++)//转换2至36进制
        {
                base_conversion(str.c_str(), source_base, &data, i);
                std::cout << "转换为" << i << "进制:" << data << std::endl;
                free(data);
                data = 0;
        }
}


示例:10进制123456转化为16进制,详细算法解析首先将每一位分开并以十进制储存1            2             3             4             5             61/16=0(记录到第一位)1%16*10=10(加到第二位)0            12          3             4             5             612/16=0(记录到第二位)12%16*10=120(加到第三位)0            0             123      4             5             6123/16=7(记录到第三位)123%16*10=110(加到第四位)0            0             7             114      5             6114/16=7(记录到第四位)114%16*10=20(加到第五位)0            0             7             7             25          625/16=1(记录到第五位)25%16*10=90(加到第六位)0            0             7             7             1             9696/16=6(记录到第六位)96%16=0(作为十六进制第一位)00            0             7             7             1             6十进制不为0再来一遍7            7             1             67/16=0(记录到第一位)7%16*10=70(加到第二位)0            77          1             677/16=4(记录到第二位)77%16*10=130(加到第三位)0            4             131      6131/16=8(记录到第三位)131%16*10=30(加到第四位)0            4             8             3636/16=2(记录到第四位)96%16=4(作为十六进制第二位)040            4             8             2十进制不为0再来一遍4            8             24/16=0(记录到第一位)4%16*10=40(加到第二位)0            48          248/16=3(记录到第二位)48%16*10=0(加到第三位)0            3             22/16=0(记录到第三位)2%16=2(作为十六进制第三位)0420            3             0十进制不为0再来一遍3            03/16=0(记录到第一位)3%16*10=30(加到第二位)0            3030/16=1(记录到第二位)30%16=14(作为十六进制第四位)042E0            1十进制不为0再来一遍11/16=0(记录到第一位)1%16=1(作为十六进制第五位)042E10十进制为0,结束,把十六进制倒过来最终答案:1E240

ouyangbao 发表于 2019-10-18 16:08

感觉很NB的样子,但是有什么用呢/

15774211127 发表于 2019-10-18 16:21

现在申请会员这么简单了吗{:1_904:},以前不是要看雪加精的帖子吗

Hmily 发表于 2019-10-18 20:38

抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。
页: [1]
查看完整版本: 申请会员ID:gxup320