Java实现开根号运算(不使用数组和String)
使用Java自己实现开根号运算,网上也有不少代码,多数都使用String或者数组。这里写一段只使用double基础数据类型实现的方法。
private static double sqrt(int n, int p) {
double lower = 0;
while (lower * lower < n) {
lower++;
}
--lower;
int flag = 1;
int d = 10;
while (flag <= p + 1) {
d = 10;
for (int x = 1; x < flag; x++) {
d = d * 10;
}
double step = 1.d / d;
for (int i = 0; i < 10; i++) {
if (lower * lower > n) {
break;
}
lower = lower + step;
}
lower = lower - step;
flag++;
}
double v1 = lower * (d * 10);
int v = ((int) v1 % 100) / 10;
double res;
if (v < 5) {
res = (lower * d - v) / d;
} else {
res = (lower * d - v + 10) / d;
}
return res;
}
参数中n是整数,p是精度。这种程序一般不能支持特别高的精度(比如几十位),五六位就不错了。
代码原理简单,这里就不说了。先看一下输出:
public static void main(String[] args) {
System.out.println("2 1 = " + sqrt(2, 1));
System.out.println("2 2 = " + sqrt(2, 2));
System.out.println("2 3 = " + sqrt(2, 3));
System.out.println("2 4 = " + sqrt(2, 4));
System.out.println("3 2 = " + sqrt(3, 2));
System.out.println("3 3 = " + sqrt(3, 3));
System.out.println("25 4 = " + sqrt(25, 4));
System.out.println("25 6 = " + sqrt(25, 6));
}
输出
2 1 = 1.4000000000000004
2 2 = 1.41
2 3 = 1.414
2 4 = 1.4142
3 2 = 1.7300000000000004
3 3 = 1.7320000000000004
25 4 = 5.0000099999999925
25 6 = 5.000000099999996
由于double精度的问题,输出并不完全满足要求,当需要几位精度的时候要截取前几位。
另外,当输入的整数比较大的时候,精度丢失也比较快:
2500 5 = 50.00000000000001
2500 6 = 49.999999500000015
25 6 = 5.000000099999996
25 7 = 4.999999949999996
可以看到给25开根号6位精度还行,给2500开的话,6位精度已经不能保证了。
上面的代码在while确定整数部分的时候可以优化,并不需要把所有小于平方根的数都过滤一遍。读者可以尝试一下。
Java实现开根号运算(不使用数组和String)的更多相关文章
- java实现开根号的运算
面试的时候,偶然被问到,开根号的实现,虽然给面试官讲解了思路,但是没有实际实现过,今天闲来无事,就把自己的思路写一下,做个笔记. 如果某个数字正好可以开根号为2个整数,例如1,4,9等,那就很简单了. ...
- java实现开根号算法
public static void main(String[] args) { long start = System.currentTimeMillis(); double target=9876 ...
- java压缩和解压字符串,Byte数组,String
在网上找到的压缩解压的工具类,可以压缩String字符串 /*** * 压缩GZip * * @param data * @return */ public static byte[] gZip(by ...
- 第三节:带你详解Java的操作符,控制流程以及数组
前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...
- 各大公司java后端开发面试题
各大公司Java后端开发面试题总结 ThreadLocal(线程变量副本)Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量.采用空间换时间,它用于线程间的数据隔离 ...
- HDU 5828 Rikka with Sequence(线段树 开根号)
Rikka with Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...
- Java二进制和位运算,这一万字准能喂饱你
基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...
- [Java入门笔记] Java语言基础(五):数组
简介 数组可用用于存储存储多个数据,Java的数组要求所有的数组元素具有一种相同的数据类型.一旦数组初始化完成,数组在内存中的空间被固定下来,长度不可改变,即使把数组的元素清空,所占用的空间依然被保留 ...
随机推荐
- Day1 【Scrum 冲刺博客】
(因发作业当天没注意看作业内容,第一天的冲刺博客和第二天的同时发!!!不好意思!!!) 各个成员在 Alpha 阶段认领的任务 方晓莹 搭建社区管理系统的前端框架 登录页开发 管理员模块个人中心开发 ...
- linux服务器性能分析只需1分钟
背景: 现在的互联网公司,大多数时候应用服务都是部署在linux服务器上,那么当你的服务运行过程中出现了一些响应慢,资源瓶颈等疑似性能问题时,给你60秒,如何快速完成初步检测? 肯定有人会说用工具,公 ...
- wpa_supplicant 检测错误密码
选好了 wifi ssid,填了密码,生成新配置文件,重启了wpa_supplicant,怎么知道输入的密码对不对,如果不对有什么体现? wpa_supplicant 前台运行时,打印信息中会有: W ...
- css进阶 02-CSS布局
02-CSS布局 #前言 #常见的布局属性 (1)display 确定元素的显示类型: block:块级元素. inline:行内元素. inline-block:对外的表现是行内元素(不会独占一行) ...
- <未解决的问题>crontab 定时弹框任务
问题:crontab写别的定时脚本就可以执行(比如说每隔一分钟就创建一个txt文件),但是写shell就不知道为什么,反弹不了 但是开启Linux终端窗口单独执行bash shell时候,(不通过re ...
- python爬虫爬取安居客并进行简单数据分析
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 爬取过程一.指定爬取数据二.设置请求头防止反爬三.分析页面并且与网页源码进行比对四.分析页面整理数据 ...
- Excel-VLOOKUP函数组合应用④
问题场景 查找匹配并返回多列数据,例如:将某个部门所涉及的相关列的数据从[全员数据源]中整理出来,并按照一定顺序,然后发送给各部门的负责人. 场景 从[全员数据源]中共23列数据,整理出[测试部门人员 ...
- 实验3 C语言分支语句和循环语句编程应用(友好猜日期^_^)
实验任务一 #include <stdio.h> #include <math.h> int main(){ float a, b, c, x1, x2; float delt ...
- @Autowired 和@Resource区别
二者都可以用在bean的注入时,但是@Autowired是spring提供的注解,而@Resource是javax包中的. 默认情况下,@Autowired注入规则是byType,通过类型注入:当然, ...
- Java动态代理分析
Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地制定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分配到委托对象上反射执行,配置执行过程中,开发 ...