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;
}
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源