十六进制(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
- 十六进制(2^n进制)转换十进制(非2^n进制)快速算法
- 十进制转换为N进制
- 十六进制快速转换八进制(算法核心可适用于2^n进制转化)
- 进制转换(十进制转n进制)
- 十进制数转换n进制(Java)
- 十进制 转n(2-16) 进制
- 十六进制转换十进制算法
- 十进制转成n进制
- 十进制转N进制
- 十进制转n进制
- 十进制转换成十六进制、16进制转2进制
- 进制转换(十进制转换N进制)的实现
- 十六进制与十进制快速转换
- 用递归实现十进制数转换N进制
- 将十进制的一个数转换为n进制
- 递归实现十进制到n[2, 10]进制转换
- 递归实现十进制到n[2, 10]进制转换
- 十进制转化成N进制
- 《UML精粹》第11章 互动图
- 用户权限数据库设计
- 合作再次升级,联想京东电商战略渐现
- 第三周项目五(1)
- Maven项目使用Junit
- 十六进制(2^n进制)转换十进制(非2^n进制)快速算法
- 第一章 第八题
- JavaBean
- Hadoop学习笔记0001——Hadoop安装配置
- 第一章 第九题
- HDOJ1720|再谈IO库:iostream的格式化输入输出
- Android InflateLayout.inflate()原理分析
- Linux负载均衡软件LVS之一(概念篇)
- 公开课机器学习笔记(15)支持向量机五 坐标上升法 SMO优化算法