今天看到一道腾讯笔试题:计算2的1000次方,并打印出来,限时20分钟。

计算机里面,乘以2可以用移位操作进行优化,先用浮点数实现,具体思路如下:

int factor = 1000; //  1000次方
int bits = 16; //  取值段的位数
int shift = 1 << bits; //  取值段的值,移位计算
int remain = factor % bits; // 剩余的位数
int quant = (factor - remain) / bits; // 取值段的个数
double result = 1.0; // 采用浮点数保存结果,并初始化为1
for (int i = 0; i < quant; i++)result *= shift; // 叠乘每个取值段
result *= 1 << remain; // 叠乘剩余的位数
System.out.println("double result=" + result); // 打印结果

计算机的浮点数精度还是太低,用长整数进行结果优化,代码如下:

int factor = 1000; // 1000次方
int bits = 16;   // 取值段的位数
int limit = 100000; // 每个整数结果的范围
int limitLen = 5;  // 每个整数结果范围的位数
int remain = factor % bits;  // 剩余的位数
int quant = (factor - remain) / bits; // 取值段的个数
long[] result = new long[factor >> 1]; // 创建结果整数
result[0] = 1;  // 初始化结果整数为1
for (int i = 0; i <= quant; i++) { // 叠乘每个取值段long carry = 0; // 每个结果整数的进位int shift = i == quant ? remain : bits; // 移位for (int j = 0; j < result.length; j++) {long temp = (result[j] << shift) + carry; // 计算每个结果整数result[j] = temp % limit; // 取余数carry = (temp - result[j]) / limit; // 取进位}
}
System.out.print("long result="); // 打印结果
boolean flag = false;
for (int j = result.length - 1; j >= 0; j--) { // 打印每个结果整数if (flag || result[j] > 0) {String text = result[j] + "";for (int i = text.length(); flag && i < limitLen; i++)System.out.print("0"); // 每个结果整数不足部分补零System.out.print(text); // 打印每个结果整数System.out.print(" "); // 打印分割符flag = true;}
}
System.out.println();

计算结果与浮点数的相同,优化后数组精确记录了每一位结果的值。

源码:

https://github.com/zdzsoft2020/interview

https://gitee.com/xt123/interview

计算2的1000次方相关推荐

  1. 计算 2 的 1000次方

    计算 2 的 1000次方 参考自:http://www.cnblogs.com/herbert/archive/2011/02/13/1953943.html Project Euler probl ...

  2. 关于2的1000次方

    之前看到文章说,一道面试题,计算2的1000次方. 底下的评论基本上都是说因为数据长度非常大,需要按数据的每一位来创造数组,按数组的每位做循环计算. 如果用js的话,一行代码搞定,而且速度很快,耗时4 ...

  3. c语言计算2的n次方(可以1000次方以上)(利用数组)

    #include<stdio.h> #include<stdlib.h> //计算2的n次方,创建数组赋予足够大的空间,使用for循环执行n次,如果a[i]>9则a[i] ...

  4. 信息学奥数一本通(1170:计算2的N次方)

    1170:计算2的N次方 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 15778     通过数: 8179 [题目描述] 任意给定一个正整数N(N<=1 ...

  5. 12:计算2的N次方

    原题链接 总时间限制:  1000ms  内存限制:  65536kB 描述 任意给定一个正整数N(N<=100),计算2的n次方的值. 输入 输入一个正整数N. 输出 输出2的N次方的值. 样 ...

  6. 39页第7题 计算2的i次方之和

    /*计算2的i次方之和*/ #include<stdio.h> #include<math.h>/*调用math.h文件中的函数*/ int main(void) {int n ...

  7. Python计算 1的9999999次方,不到1s就得出答案!是如何处理的?

    问题引发 网友计算1的9999999次方,不到1s就得出答案.那python是如何处理的? >>> a=1 >>> i=a**9999999 >>> ...

  8. 从键盘上录入两个整数,计算a的b次方的结果

    从键盘上录入两个整数,计算a的b次方的结果 /*** 从键盘上录入两个整数,计算a的b次方的结果*/import java.util.Scanner;public class Test25 {publ ...

  9. 信息学奥赛一本通 1170:计算2的N次方 | OpenJudge NOI 1.6 12:计算2的N次方

    [题目链接] ybt 1170:计算2的N次方 OpenJudge NOI 1.6 12:计算2的N次方 [题目考点] 1. 高精度 考察:高精乘低精 高精度计算讲解 2. 快速幂 [解题思路] 先估 ...

最新文章

  1. Python 动态变量名定义与调用
  2. c++读取txt中每行的数据到数组中
  3. Java反序列化json内存溢出_反序列化JSON时出现线程错误
  4. python 定时任务系统_Python定时任务,实现自动化的方法
  5. vux radio 改造为 tree 代码片段
  6. 疫情当前,企业“逆势而上”还需“上云”加速
  7. 苹果手机html查看器在哪,web前端案例-苹果手机图片查看器
  8. ssh备份linux系统,远程自动备份 rsync+ssh+sshpass
  9. 三星 android截屏快捷键是什么手机,三星手机如何快速截屏?两种快速截图方法教给你!...
  10. 【避坑指南】GD32 KEIL中SW Device没有识别芯片,jlink下载不进去的问题
  11. 关于Froala Editor的简单使用
  12. 一个屌丝程序猿的人生(二十六)
  13. MongoDB Bulk write operation error on server duplicate key error问题解决
  14. Laravel5.4中文分词搜索-使用 Laravel Scout,Elasticsearch,ik 分词(三)
  15. 乐学习知选择--我的J2EE技术历程
  16. 《当阿呆遇上阿瓜》:当铁锹遇上石头
  17. Oracle项目管理主数据之CBS
  18. 哪怕荆棘满路,我们仍无畏前行
  19. 职场规划的行动路径是什么?
  20. JAVA 接口Interface练习②

热门文章

  1. 中序建立二叉树,非递归前序遍历二叉树
  2. 单独mybatis得使用
  3. 移动app开发流程,app开发步骤
  4. 三防漆喷涂工艺正确方法和注意事项(SKYWAY伟天三防漆)
  5. 单链表结构与顺序存储结构优缺点
  6. c语言多进程编程,C语言中的多进程
  7. c语言驾照管理系统,驾照登陆平台
  8. URLConnection(一)
  9. Python面向对象封装案例——士兵突击
  10. 利用微软产品行业解决方案,小蚁科技追求伟大梦想