`
qing_gee
  • 浏览: 118164 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

不使用已有函数求出一个数的平方根

    博客分类:
  • Java
阅读更多

      前一段时间领导出了一道算法题(找出一个数的平方根,精确到小数点后两位,不使用函数库),对此一直耿耿于怀,始终觉得自己的答案是有问题的,但是暂时没有想到其他好的办法。

      我是先求出最接近这个数的一个能够整除的平方根,比如说1的平方根是1,2的最接近的平方根也是1,3的最接近平方根也是1,而5的最接近的平方跟是2,那么以2为基数,每次叠加0.01,加入说root是平方根,那么找出root 乘以root,然后乘积比该数大0.001的数。具体算法见以下代码:

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 找出一个数的平方根,精确到小数点后两位,不使用函数库.
 * 
 * @author qinge
 *
 */
public class Square {

	public static void main(String[] args) {
		for (int num = 1; num <= 1000; num++) {
			System.out.print(num + "的函数平方根:" + Math.sqrt(num));
			double root = findSmallRoot(num);
			System.out.print(" 小数点前一位是:" + root);
			while (true) {
				double product = root * root;
				if (product == num) {
					System.out.print(" 计算得出平方根是:" + root + "\n");
					break;
				} else if (product > num) {// 此处算法有遗漏
					if (product - num > 0.001) {
						System.out.print(" 计算得出平方根是:" + root + "\n");
						break;
					}
				}

				// 用加0.01进行控制
				root = root + 0.01;
				// 对double类型进行精度控制
				root = BigDecimal.valueOf(root).setScale(2, RoundingMode.HALF_UP).doubleValue();
			}
		}
	}

	/**
	 * 找出num的平方根的小数点前面的数字
	 * 
	 * @param num
	 * @return
	 */
	public static int findSmallRoot(int num) {
		// 遍历平方根的基数,基数的乘机必然会小于等于num
		for (int i = 1; i <= num && i * i <= num; i++) {
			// 找出基数则返回
			if (i * i == num) {
				return i;
			}
		}
		// 找num-1
		return findSmallRoot(num - 1);
	}
}

 相信一些大牛们一定有自己更神奇的算法,那么就贴出来吧!学习膜拜中...

1
3
分享到:
评论
6 楼 thihy 2015-06-14  
qing_gee 写道
thihy 写道
1. 二分!
2. 级数展开!
3. 迭代的方法:如牛顿下山法:http://blog.csdn.net/free4294/article/details/6929950


看了牛顿迭代法,还没想清楚为什么。


可以看牛顿下山法的图示,与0.001的累加效果差不多,但是牛顿的方法更加快,一般几个迭代就O了。
5 楼 a942010 2014-08-04  
import java.util.Scanner;

public class PingFangGen {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		double i = scanner.nextDouble();
		for (double j = 0; j < 100;) {
			j += 0.001;
			if (j * j <= i && j * j >= i - 0.01) {
				System.out.println(j);
				break;
			}
		}
	}
}




还可以这样
4 楼 a942010 2014-08-04  
import java.util.Scanner;


public class PingFangGen {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double i = scanner.nextDouble();
for (int j = 0; j < 1; ) {
double d = Math.random()*10;
if(d*d<=i&&d*d>=i-0.01){
System.out.println(d);
break;
}
}
}
}



可以这样吗?
3 楼 lasaka 2014-08-04  
package acer;

import java.io.IOException;
import java.util.Scanner;

public class Test {

	public static void main(String aa[]) throws IOException {
		double inputNumber = 0;
		int sqare = 0;
		double sqresult = 0;
		double closeNumber = 0;
		double closeNumberMinusOne = 0;
		double lastCloseNumber = 0;
		boolean check = true;
		boolean first = true;

		Scanner scanner = new Scanner(System.in);
		inputNumber = scanner.nextDouble();//數字
		sqare = scanner.nextInt();//平方數

		for (int i = 1; i < inputNumber + 1; i++) {
			sqresult = i;
			for (int j = 1; j < sqare; j++) {
				sqresult *= i;
			}
			if (sqresult >= inputNumber) {
				closeNumber = i;
				closeNumberMinusOne = closeNumber - 1.0;
				break;
			}
		}

		while (check) {
			if (sqresult == inputNumber) {
				check = false;
				sqresult = sqare(sqare, closeNumber);
			} else {
				// 表示超過小數點第16位了
				if (closeNumberMinusOne != 0
						&& lastCloseNumber == closeNumberMinusOne) {
					check = false;
				}
				if (first) {
					first = false;
					lastCloseNumber = closeNumberMinusOne;
					closeNumberMinusOne += (closeNumber - closeNumberMinusOne) / 2;
				} else {
					closeNumber = closeNumberMinusOne;
					if (sqresult > inputNumber) {
						if (lastCloseNumber > closeNumberMinusOne) {
							closeNumberMinusOne -= (lastCloseNumber - closeNumberMinusOne) / 2;
						} else {
							closeNumberMinusOne -= (closeNumberMinusOne - lastCloseNumber) / 2;
						}
					} else {
						if (lastCloseNumber > closeNumberMinusOne) {
							closeNumberMinusOne += (lastCloseNumber - closeNumberMinusOne) / 2;
						} else {
							closeNumberMinusOne += (closeNumberMinusOne - lastCloseNumber) / 2;
						}
					}
					lastCloseNumber = closeNumber;
				}
				sqresult = sqare(sqare, closeNumberMinusOne);
			}
		}
	}

	public static double sqare(int sqare, double result) {
		double sqresult = result;
		for (int j = 1; j < sqare; j++) {
			sqresult *= result;
		}
		System.err.println("次方根: " + result);
		System.err.println("次方結果: " + sqresult);
		return sqresult;
	}
}
2 楼 qing_gee 2014-08-04  
thihy 写道
1. 二分!
2. 级数展开!
3. 迭代的方法:如牛顿下山法:http://blog.csdn.net/free4294/article/details/6929950


看了牛顿迭代法,还没想清楚为什么。
1 楼 thihy 2014-08-03  
1. 二分!
2. 级数展开!
3. 迭代的方法:如牛顿下山法:http://blog.csdn.net/free4294/article/details/6929950

相关推荐

    Lotus公式语言函数简介

    @Power 求一个数的幂值 @Prompt 显示一个对话框,并根据用户的操作返回一个文本值。@Prompt 用来给用户提示信息,并根据用户的输入确定以后的操作过程 @ProperCase 将字符串中的单词转换成字首大写的形式 @Random ...

    javascript文档

    isFinite 方法 返回一个 Boolean 值,表明某个给定的数是否是有穷的。 isNaN 方法 返回一个 Boolean 值,表明某个值是否为保留值 NaN(不是一个数)。 isPrototypeOf 方法 返回一个 Boolean 值,表明对象是否存在...

    Excel函数活用范例大辞典(全新版).何先军.2015-2(带书签高清文字版).pdf

    本书侧重于函数的实战应用,共分12章,前10章分别介绍了数学函数、统计函数、日期和时间函数、文本函数、逻辑函数、查找和引用函数、财务函数、信息函数以及数据库和三角函数在实战中的应用;第11 章介绍了函数与...

    微软JavaScript手册

    isFinite 方法 返回一个 Boolean 值,表明某个给定的数是否是有穷的。 isNaN 方法 返回一个 Boolean 值,表明某个值是否为保留值 NaN(不是一个数)。 isPrototypeOf 方法 返回一个 Boolean 值,表明对象是否存在...

    JScript 语言参考

    isFinite 方法 返回一个 Boolean 值,表明某个给定的数是否是有穷的。 isNaN 方法 返回一个 Boolean 值,表明某个值是否为保留值 NaN(不是一个数)。 isPrototypeOf 方法 返回一个 Boolean 值,表明对象是否存在...

    VBSCRIP5 -ASP用法详解

    Replace 函数 返回一个字符串,其中某个指定的子串被另一个子串替换,替换的次数也有规定。 Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最...

    VBSCRIPT中文手册

    Replace 函数 返回一个字符串,其中某个指定的子串被另一个子串替换,替换的次数也有规定。 Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最...

    VBScript 语言参考中文手册CHM

    Replace 函数 返回一个字符串,其中某个指定的子串被另一个子串替换,替换的次数也有规定。 Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最...

    VBScript 语言参考

    Replace 函数 返回一个字符串,其中某个指定的子串被另一个子串替换,替换的次数也有规定。 Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最...

    vb Script参考文档

    Replace 函数 返回一个字符串,其中某个指定的子串被另一个子串替换,替换的次数也有规定。 Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最...

    数值分析软件 v1.1

    对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。因此,如何求得满足一定精度要求的方程的近似根也就成为了广大科技工作者迫切需要解决的问题。...

    程序员的SQL金典6-8

     2.2.6 修改已有数据表  2.2.7 删除数据表  2.2.8 受限操作的变通解决方案 第3章 数据的增、删、改  3.1 数据的插入  3.1.1 简单的INSERT语句  3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  ...

    程序员的SQL金典7-8

     2.2.6 修改已有数据表  2.2.7 删除数据表  2.2.8 受限操作的变通解决方案 第3章 数据的增、删、改  3.1 数据的插入  3.1.1 简单的INSERT语句  3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  ...

    程序员的SQL金典3-8

     2.2.6 修改已有数据表  2.2.7 删除数据表  2.2.8 受限操作的变通解决方案 第3章 数据的增、删、改  3.1 数据的插入  3.1.1 简单的INSERT语句  3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  ...

    程序员的SQL金典4-8

     2.2.6 修改已有数据表  2.2.7 删除数据表  2.2.8 受限操作的变通解决方案 第3章 数据的增、删、改  3.1 数据的插入  3.1.1 简单的INSERT语句  3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  ...

    数值分析软件 v1.1 2009年最新版(简体中文)

    对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。因此,如何求得满足一定精度要求的方程的近似根也就成为了广大科技工作者迫切需要解决的问题。...

    数值分析软件 v1.1 2009年9月最新版(简体中文)

    对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。因此,如何求得满足一定精度要求的方程的近似根也就成为了广大科技工作者迫切需要解决的问题。...

    数值分析软件 v1.1 2008年最新版

    对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。因此,如何求得满足一定精度要求的方程的近似根也就成为了广大科技工作者迫切需要解决的问题。...

    程序员的SQL金典.rar

     2.2.6 修改已有数据表  2.2.7 删除数据表  2.2.8 受限操作的变通解决方案 第3章 数据的增、删、改  3.1 数据的插入  3.1.1 简单的INSERT语句  3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  ...

    程序员二进制计算器 v1.36

    如果操作数是一个常数,它不需要用括号括起,并且与运算符之间不需要空格分隔,如: sqr2 = 1.41421 cos0 = 1 当操作数是表达式时,需要用括号括起,以划分优先级: sqr(1 + 2) = 1.73205 当操作数是一个内置...

Global site tag (gtag.js) - Google Analytics