码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-15 21:21:39      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:21000   各位和   

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

 

 

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

标签:21000   各位和   

原文地址:http://blog.csdn.net/chunyexiyu/article/details/39296235

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!