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;
}