计算2的1000次方
今天看到一道腾讯笔试题:计算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次方相关推荐
- 计算 2 的 1000次方
计算 2 的 1000次方 参考自:http://www.cnblogs.com/herbert/archive/2011/02/13/1953943.html Project Euler probl ...
- 关于2的1000次方
之前看到文章说,一道面试题,计算2的1000次方. 底下的评论基本上都是说因为数据长度非常大,需要按数据的每一位来创造数组,按数组的每位做循环计算. 如果用js的话,一行代码搞定,而且速度很快,耗时4 ...
- c语言计算2的n次方(可以1000次方以上)(利用数组)
#include<stdio.h> #include<stdlib.h> //计算2的n次方,创建数组赋予足够大的空间,使用for循环执行n次,如果a[i]>9则a[i] ...
- 信息学奥数一本通(1170:计算2的N次方)
1170:计算2的N次方 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 15778 通过数: 8179 [题目描述] 任意给定一个正整数N(N<=1 ...
- 12:计算2的N次方
原题链接 总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个正整数N(N<=100),计算2的n次方的值. 输入 输入一个正整数N. 输出 输出2的N次方的值. 样 ...
- 39页第7题 计算2的i次方之和
/*计算2的i次方之和*/ #include<stdio.h> #include<math.h>/*调用math.h文件中的函数*/ int main(void) {int n ...
- Python计算 1的9999999次方,不到1s就得出答案!是如何处理的?
问题引发 网友计算1的9999999次方,不到1s就得出答案.那python是如何处理的? >>> a=1 >>> i=a**9999999 >>> ...
- 从键盘上录入两个整数,计算a的b次方的结果
从键盘上录入两个整数,计算a的b次方的结果 /*** 从键盘上录入两个整数,计算a的b次方的结果*/import java.util.Scanner;public class Test25 {publ ...
- 信息学奥赛一本通 1170:计算2的N次方 | OpenJudge NOI 1.6 12:计算2的N次方
[题目链接] ybt 1170:计算2的N次方 OpenJudge NOI 1.6 12:计算2的N次方 [题目考点] 1. 高精度 考察:高精乘低精 高精度计算讲解 2. 快速幂 [解题思路] 先估 ...
最新文章
- Python 动态变量名定义与调用
- c++读取txt中每行的数据到数组中
- Java反序列化json内存溢出_反序列化JSON时出现线程错误
- python 定时任务系统_Python定时任务,实现自动化的方法
- vux radio 改造为 tree 代码片段
- 疫情当前,企业“逆势而上”还需“上云”加速
- 苹果手机html查看器在哪,web前端案例-苹果手机图片查看器
- ssh备份linux系统,远程自动备份 rsync+ssh+sshpass
- 三星 android截屏快捷键是什么手机,三星手机如何快速截屏?两种快速截图方法教给你!...
- 【避坑指南】GD32 KEIL中SW Device没有识别芯片,jlink下载不进去的问题
- 关于Froala Editor的简单使用
- 一个屌丝程序猿的人生(二十六)
- MongoDB Bulk write operation error on server duplicate key error问题解决
- Laravel5.4中文分词搜索-使用 Laravel Scout,Elasticsearch,ik 分词(三)
- 乐学习知选择--我的J2EE技术历程
- 《当阿呆遇上阿瓜》:当铁锹遇上石头
- Oracle项目管理主数据之CBS
- 哪怕荆棘满路,我们仍无畏前行
- 职场规划的行动路径是什么?
- JAVA 接口Interface练习②