首页 > 代码库 > 计算2^1000/2^10000的各位数和

计算2^1000/2^10000的各位数和

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

 

 

计算2^1000/2^10000的各位数和