2^1000在各进制的表示:
2进制: 1000.....(共跟1000个0)
8进制: 2000....(共跟333个0)
16进制: 10000...(共跟250个0)
二进制转十进制的计算过程等于:2*2*2....(共1000个2相乘)
考虑到相乘的结果比较大=(2^10)^100=(1024)^100 >= (1000)^100 = 1000..(后面300个0)
精确计算的话,现有的类型是不能满足的。
所以我们一般使用 char* 来存储相关的值,并进行相关计算:
2^2 = 2+2 = 4
2^3 = 4+4 = 8
2^4 = 8+8 = 16
2^5 = 16 + 16 = 32
...
2^1000 相当于经过999次加法计算即可得出。我们只要开发逐字节相加的char*,模拟10进制加法运算即可。
下面的计算是使用g++编译的计算程序,使用PC机计算的效率:
2^1000计算完毕15ms
2^10000计算完毕2.5s
#include "stdio.h" #include <vector> #include "time.h" #define N_SIZE 10000 bool plusSelf(std::vector<char>& vecBytes) { int nPlus = 0; for (int i=0; i<vecBytes.size(); i++) { // 使用*2速度 == <1 速度 > A+A速度,速度快约30%,具体原因可能是因为 // 1. 不用查找变量 // 2. 对于*2有优化,直接使用<1位的结果 int result = vecBytes[i] * 2 + nPlus; //int result = vecBytes[i] <1 + nPlus; //int result = vecBytes[i] + vecBytes[i] + nPlus; // 使用下面这两种效率很接近,对比来看,第二种稍微快一点点,不超过3% // 1。 第二种多了一个比较判断,但对于nPlus采用的直接赋值 // 2. 第一种使用求余和除法,因为char型的数据比较短,才8个字节,所以对于这种情况,也还比较快 // 建议的话,采用两种方法均可,第一种代码短,第二种速度稍微快一点点 //vecBytes[i] = result % 10; //nPlus = result / 10; if (result < 10) { vecBytes[i] = result; nPlus = 0; } else { vecBytes[i] = result - 10; nPlus = 1; } } } int main() { std::vector<char> vecBytes; vecBytes.resize(N_SIZE/3, 0); vecBytes[0] = 1; for (int i=0; i<N_SIZE; i++) { plusSelf(vecBytes); } for (int i=0; i<vecBytes.size(); i++) { printf("%c", vecBytes[i] + '0'); } printf("\n"); int nTotal = 0; for (int i=0; i<vecBytes.size(); i++) { nTotal += vecBytes[i]; } printf("nTotal: %d clock: %d\n", nTotal, clock()); getchar(); return 0; }
时间: 2024-10-12 13:27:35