`
qing_gee
  • 浏览: 120843 次
  • 性别: 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

相关推荐

    数学论文 平方根的十分位问题

    已有的研究成果表明,c(1) = 4,c(2) = 9,c(3) = 13。王勇进一步证明了对任意正整数k,c(k) = 5k - 1。而本文作者则得出了更为全面的结果,包括两个主要定理: 定理1表明,如果n大于c(l,k)并且k在[]+1的范围内,...

    MATLAB常用函数的使用技巧分享.docx

    例如,如果有一个 3×2 的矩阵 A,使用 repmat(A, 2, 3) 将返回一个 6×6 的矩阵,其中每个元素都是原来的 A 对应位置的元素。 二、数学计算函数 1. sqrt 函数:sqrt 函数用于求平方根。例如,如果要求 x 的平方根...

    c语言函数库c语言函数库

    4. 内存管理函数:`malloc`用于动态分配内存,`calloc`一次性分配多个零初始化的内存块,`realloc`调整已分配内存的大小,`free`则用于释放不再使用的内存。 5. 文件操作函数:`fopen`打开文件,`fclose`关闭文件,...

    Access函数汇总.pdf

    1. Abs函数:返回一个数的绝对值。 2. Array函数:创建一个数组。 3. Asc函数:返回代表字符的ASCII值。 4. Atn函数:返回一个数的反正切值。 5. CallByName函数:调用对象的方法或设置/返回一个对象的属性值。 6. ...

    c/c++函数大全(标准函数)

    在C/C++编程语言中,函数是代码组织的基本单元,它们允许我们将一组特定任务封装到一个可重用的模块中。C/C++函数大全通常包括了各种标准库提供的函数,这些函数涵盖了输入/输出、数学运算、字符串处理、内存管理等...

    C++常用系统函数

    * memchr函数:查找buf的前count个字节中c的第一次出现,当找到c或已检查完count个字节时停止。 * memcpy函数:从src拷贝count个字节到dest。如果源缓冲区和目的缓冲区重叠,这个函数不能保证正确拷贝。 * _memicmp...

    PHP函数索引 967 个函数

    `aspell_new` 函数用于创建一个新的拼写检查对象,这是使用aspell拼写检查库前的必要步骤。 ### 8. base64_decode: BASE64解码 `base64_decode` 函数用于将BASE64编码的字符串解码回原始格式,常用于加密传输后的...

    C语言函数大全语法

    - `pow()`:用于计算一个数的幂次。 - `sqrt()`:用于求平方根。 3. 字符处理函数: - `getchar()`:从标准输入读取一个字符。 - `putchar()`:将一个字符写入标准输出。 - `isalpha()`, `isdigit()`:检查...

    c函数大全包含了所有c语言函数

    "C函数大全"是一个集合了C语言中所有标准库函数的参考资料,对于学习和使用C语言的人来说,这是一个不可或缺的工具。下面,我们将深入探讨C语言中的主要函数类别及其功能。 1. 输入/输出函数: - `printf` 和 `...

    C语言函数-TXT文档-常用函数

    函数库是预先编写好的一组函数集合,方便程序员在开发过程中复用这些已验证过的功能。本资料主要涵盖C语言中的常用函数,特别是与处理文本文件(如TXT文档)相关的函数。下面将详细介绍这些知识点。 1. **标准输入...

    C语言函数大全.rar

    本资源“C语言函数大全.rar”是一个集合了C语言中常见函数的参考资料,对于想要深入学习C语言的初学者来说,是一个非常有价值的资源。 在C语言中,函数是代码组织的基本单元,它封装了一段具有特定功能的代码,可以...

    C语言常用函数手册.rar

    4. 数学运算函数:在`&lt;math.h&gt;`库中,有`sqrt`求平方根,`pow`进行指数运算,`sin`, `cos`, `tan`进行三角函数计算,`fabs`求绝对值等。这些函数扩展了C语言的算术运算能力。 5. 内存管理函数:`malloc`动态分配...

    不导入任何函数的程序

    总结来说,创建一个“不导入任何函数”的程序是一项挑战性的任务,它要求程序员深入理解计算机系统的工作原理,自行实现各种功能,并且对内存管理和操作系统接口有深入的了解。这样的程序虽然可能更小、更独立,但也...

    C语言函数详解大全

    "C语言函数详解大全"是一个针对C语言函数的全面参考资料,它包含了C语言开发过程中可能用到的所有函数,每个函数都有详尽的功能解释、使用方法以及示例代码,是学习和查阅C语言函数的宝贵资源。 C语言中的函数是...

    C语言标准函数库速查手册.chm

    4. **数学运算**:头文件中的函数,如sqrt()计算平方根,pow()求幂,sin()、cos()和tan()进行三角函数运算,log()和exp()进行对数和指数运算。 5. **错误处理**:头文件中的errno变量和perror()函数,用于处理运行...

    C语言常用函数速查工具

    《C语言常用函数速查工具》是一款为C语言开发者量身打造的实用工具,它集成了C语言中常用的函数,并提供了快速检索和详尽的使用说明。这款工具旨在帮助程序员在编写代码时能够迅速找到所需的函数,提高开发效率,...

    C语言常用函数手册

    3. 数学函数:`sqrt()` 用于求平方根,`pow()` 实现指数运算,`sin()` 和 `cos()` 分别计算正弦和余弦值,`rand()` 生成随机数。 4. 内存管理函数:`malloc()` 和 `calloc()` 用于动态分配内存,`realloc()` 可以...

    vb6 函数大全

    7. `MsgBox(msg, [type])`:显示一个带有消息的对话框。 **文件操作函数**: 1. `Open`语句:打开文件,指定文件访问方式、存取类型、锁定状态等。 2. `Close`语句:关闭已打开的文件。 3. `Write#`:向文件写入...

Global site tag (gtag.js) - Google Analytics