使用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)的更多相关文章

  1. java实现开根号的运算

    面试的时候,偶然被问到,开根号的实现,虽然给面试官讲解了思路,但是没有实际实现过,今天闲来无事,就把自己的思路写一下,做个笔记. 如果某个数字正好可以开根号为2个整数,例如1,4,9等,那就很简单了. ...

  2. java实现开根号算法

    public static void main(String[] args) { long start = System.currentTimeMillis(); double target=9876 ...

  3. java压缩和解压字符串,Byte数组,String

    在网上找到的压缩解压的工具类,可以压缩String字符串 /*** * 压缩GZip * * @param data * @return */ public static byte[] gZip(by ...

  4. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...

  5. 各大公司java后端开发面试题

    各大公司Java后端开发面试题总结 ThreadLocal(线程变量副本)Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量.采用空间换时间,它用于线程间的数据隔离 ...

  6. HDU 5828 Rikka with Sequence(线段树 开根号)

    Rikka with Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  7. luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号

    因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...

  8. Java二进制和位运算,这一万字准能喂饱你

    基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...

  9. [Java入门笔记] Java语言基础(五):数组

    简介 数组可用用于存储存储多个数据,Java的数组要求所有的数组元素具有一种相同的数据类型.一旦数组初始化完成,数组在内存中的空间被固定下来,长度不可改变,即使把数组的元素清空,所占用的空间依然被保留 ...

随机推荐

  1. LeetCode初级算法之字符串:344 反转字符串

    反转字符串 题目地址:https://leetcode-cn.com/problems/reverse-string/ 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] ...

  2. 树的直径,LCA复习笔记

    前言 复习笔记第6篇. 求直径的两种方法 树形DP: dfs(y); ans=max( ans,d[x]+d[y]+w[i] ); d[x]=max( d[x],d[y]+w[i] ); int di ...

  3. shell 编程 -- 条件判断

    1.按照文件类型进行判断(常用的)-b 判断该文件是否存在-d 判断是否存在,并且是否为目录(是目录就为真)-e 判断该文件是否存在(存在为真)-f 判断文件是否存在,并且是否为普通文件(是普通文件为 ...

  4. GET和POST的区别与联系

    每日知识-GET和POST HTTP:超文本传输协议 组成部分:请求行,请求头部,一个空行,请求数据 GET和POST GET:get就是获取的意思,默认的HTTP请求方式,把参数通过 key/val ...

  5. 牛客挑战赛46 D

    题目链接: 数列 查询有多少\([l,r]\)区间满足每个数出现\(k\)的倍数次 即为\(1\)到\(r\)与\(1\)到\(l-1\)每个数相减的次数为\(k\)的倍数次 可以使用哈希维护 记录每 ...

  6. DRF对Django请求响应做了技术升级

    Django视图是用来处理请求和响应的,Django默认是按Form和Template来设计的,如果要处理以JSON格式为主的RESTful API,那么就需要对Django请求和响应的处理代码进行优 ...

  7. pandas的学习2-选择数据

    import pandas as pd import numpy as np dates = pd.date_range('20130101', periods=6) df = pd.DataFram ...

  8. GitHub 上的大佬们打完招呼,会聊些什么?

    你好 GitHub!每一位开源爱好者的好朋友「HelloGitHub」 大家好,今儿 HG 有幸邀请到:Lanking 一位亚马逊 AI 软件工程师.开源爱好者和贡献者.他是亚马逊开源的 Java 深 ...

  9. 物联网打工人必备:LiteOS Studio图形化调测能力

    摘要:本文会给大家介绍下LiteOS Studio的调测的几个知识点,包括: 调测配置,监视变量,反汇编代码同步展示,数值进制切换,跨平台编译调测,Qemu模拟器调测,多核调测,远程设备调测等. 掌握 ...

  10. [WPF] 在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点

    1. 需求 在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged,不过有时候还会需要从 MVVM 中控制 Vie ...