十六进制(2^n进制)转换十进制(非2^n进制)快速算法

来源:互联网 发布:中国进口食品数据 编辑:程序博客网 时间:2024/06/06 09:56

C++代码如下:

算法思路: 使用long long类型来保存较大的十进制数字, \n如果再大就需要用大数字数组加法来计算. 此处使用char *来保存输入的十六进制字符(边输入边存储,所以是倒着存的),\n之后使用快速的位运算而不是快速幂运算.公式为:1>>(2*4*i)\n( 1:binary : 0001 ; 2: bin-> 0010 ,不能被2的N次方搞混)计算当前结果, \n之后相加 OK! 
#include <string>#include <cmath>#include <iostream>#include <cstdio>#include <cstdlib>#include <ctime>#include <cstring>using namespace std;typedef long long ll;    /*     *   @author Hahn    *   此算法可在指数为1时减少一步计算(base *= base)    *    */ll pow(ll x, ll y)  //改进版快速幂运算{    ll r = 1;    ll base = x;    while (y > 0)    {        if (y == 1)        {            r *= base;            return r;        }        if (y & 1)            r += base;        base *= base;        y >>= 1;    }    return r;}void input(char * hex)  //倒着存{    int index = -1;    char ch;    while (ch = getchar())    {        if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F')        {            hex[++index] = ch;        }        else            break;    }    hex[++index] = '\0';}int main(){    clock_t time_one, time_two;        char hex[10];        input(hex);        /**        *   res 结果        *   i 循环计数        *   via_num , tmp 位运算临时变量        *   mutli_num  = 1 , 位运算的基数;        *   而且也不能直接用数字1来计算, 1被认为是int32 而不是ll        */        //cout << strlen(hex) - 1 << endl;        ll res = 0;        ll i = 0;        ll via_num;        ll mutli_num = 1;        ll sub_num;        time_one = clock();        int tmp = 0;        for (i = strlen(hex) - 1; i >= 0; i--, tmp++)        {            if (hex[i] == '0')                continue;            switch (hex[i])            {            case '1':            {                via_num = mutli_num << (4 * tmp);                res = res + via_num;                break;            }            case '2':            {                via_num = 2 *  mutli_num << (4 * tmp);                res = res + via_num;                break;            }            case '3':            {                via_num = 3 * (mutli_num << (4 * tmp));                res = res + via_num;                break;            }            case '4':            {                via_num = 4 * mutli_num << (4 * tmp);                res = res + via_num;                break;            }            case '5':            {                via_num = 5 * (mutli_num << (4 * tmp));                res = res + via_num;                break;            }            case '6':            {                via_num = 6 * (mutli_num << (4 * tmp));                res = res + via_num;                break;            }            case '7':            {                via_num = 7 * (mutli_num << (4 * tmp));                res = res + via_num;                break;            }            case '8':            {                via_num = 8* mutli_num << (4 * tmp);                res = res + via_num;                break;            }            case '9':            {                via_num = 9 * (mutli_num << (4 * tmp));                res = res + via_num;                break;            }            case 'A':            {                via_num = 10 * (mutli_num << (4 * tmp));                res = res + via_num;                break;            }            case 'B':            {                via_num = 11 * (mutli_num << (4 * tmp));                res = res + via_num;                break;            }            case 'C':            {                via_num = 12 * (mutli_num << (4 * tmp));                res += via_num;                break;            }            case 'D':            {                via_num = 13 * (mutli_num << (4 * tmp));                res += via_num;                break;            }            case 'E':            {                via_num = 14 * (mutli_num << (4 * tmp));                res += via_num;                break;            }            case 'F':            {                via_num = 15 * (mutli_num << (4 * tmp));                res  += via_num;                break;            }            default:                break;            }        }        cout << res << endl;        time_two = clock();        cout << "TIME = " << (double)(time_two - time_one) / CLOCKS_PER_SEC << endl;    system("pause");    return 0;}
0 0
原创粉丝点击