求立方根算法--个人对立方根算法的穷举和优化
遇到了求立方根的题目,在此做一下算法笔记,
分析过程:
数n的立方根就是n=i*i*i;所以我们会优先想到一下方法.
static double g32(double n){ //简易版double i = 0, k = 0.0005f;if (n < 0) { //输入负数判断k /= -1;}do{i+=k;}while(abs(i*i*i)<abs(n)); //abs为自己写的求绝对值方法return i;}
可以看出此方法的求解精度为0.001;且当输入数据过大时效率堪忧,所以就有了以下优化
static double g33(double n){ //优化2double i = 0, k = 5f;if (n < 0) {k /= -1;}for (int t = 0; t < 15; t++) {//精度到小数点后15位do {i += k; //开始时每次加5快速逼近正确值} while (abs(i * i * i) < abs(n)); //当i^3>=n时退出i-=k;k /= 9.2; //i还原到退出前的值,k缩小,进入下一次逼近} return i;}
此方法可以快速求得立方根,输入数值n不太大时使用,当n太大在逼近过程中i^3与(i+k)^3差距太大,循环次数剧增,进入死循环状态.在我电脑上当n=9999999999 (10个9)时就会进入死循环
所以想到一种解决方法,设置一循环次数计数器w,使k值随循环次数增加而增加,在一定程度上解决死循环问题.下面是代码
static double g34(double n){ //最终优化double i = 0, k = 5f;if (n < 0) {k /= -1;}int w=0;for (int t = 0; t < 15; t++) {do {i += k;k=k+w*k/50000;w++; //循环计数器} while (abs(i * i * i) < abs(n));i-=k;k /= 9.5;}System.out.println(w);return i;}
更改后n等于20个9也不会死循环.
最后附上所有程序代码.
package com.gfuzan.test;import java.util.Scanner;public class Test {/*** 开发: GFuZan* 时间: 2017.08.08* 功能: 立方根*/public static void main(String[] args) {System.out.print("请输入一个数: ");Scanner sc = new Scanner(System.in);double n = sc.nextDouble();sc.close();System.out.println("Math: \t"+ Math.pow(n, 1.0/3));System.out.println("My简易版: \t"+g32(n)); System.out.println("My优化2: \t"+g33(n)); System.out.println("My最终优化:\t"+g34(n)); }static double g32(double n){ //简易版double i = 0, k = 0.0005f;if (n < 0) {k /= -1;}do{i+=k;}while(abs(i*i*i)<abs(n));return i;}static double g34(double n){ //最终优化double i = 0, k = 5f;if (n < 0) {k /= -1;}int w=0;for (int t = 0; t < 15; t++) {do {i += k;k=k+w*k/50000;w++;} while (abs(i * i * i) < abs(n));i-=k;k /= 9.5;}return i;}static double g33(double n){ //优化2double i = 0, k = 5f;if (n < 0) {k /= -1;}for (int t = 0; t < 15; t++) {do {i += k;} while (abs(i * i * i) < abs(n));i-=k;k /= 9.2;}return i;}static double abs(double f) {if (f < 0) {return 0 - f;}return f;} }
运行结果
转载于:https://www.cnblogs.com/gfuzan/p/7323341.html
求立方根算法--个人对立方根算法的穷举和优化相关推荐
- 求100以内素数的方法(筛选法,穷举法,穷举法优化)
一.基本思想 //质数(素数)是指在大于1的自然数中除了1和它本身以外不再有其他因数的自然数. (1)判断一个数n是不是素数,可以用2到(int)sqrt(n)之间的所有整数去除n,看能否整除,如果都 ...
- 函数计算机求立方根,(在excel中如何求立方根值)excel中立方根公式
怎么在EXCEL2007里输入立方根? 打开Microsoft Word,菜单-插入中有一个域,点选域-点选EQ-点选R公式编辑器,找到根号公式,写好后再copy到excel里面,不过copy过去的十 ...
- 算法设计思想(1)— 穷举法
本文系 王晓华 老师 GitChat [算法应该怎么玩]课程笔记. 1. 穷举法概念 穷举法又称穷举搜索法,是一种在问题域的解空间中对所有可能的解穷举搜索,并根据条件选择最优解的方法的总称. 数学上也 ...
- c语言常用算法pdf,妙趣横生的算法(C语言实现 第2版) 带目录完整pdf[94MB]
<妙趣横生的算法(C语言实现 第2版)>是深受广大读者好评的<妙趣横生的算法(C语言实现)>一书的全新升级版.本书在第1版的基础上对原书内容做了大量的调整和补充,并将书中的实例 ...
- 【算法】最直接的算法——穷举法详解
第三章 穷举法 一.基本概念 穷举法又称为枚举法或者蛮力法,是一种简单直接解决问题的方法,常常是基于问题的直接描述去编写程序,比如说求n的阶乘,那么就直接一个循环n次的for循环. 穷举法依赖的基本技 ...
- 算法学习之模拟退火算法路径规划(python代码实现)
模拟退火算法路径规划(python代码实现) 一.引言 二.算法介绍以及伪代码 1.算法通俗介绍 2.路径规划算法伪代码 三.算法流程及代码实现 1.地图创建 2.初始化路径 小结 3.计算适应度值 ...
- 常用算法回顾——穷举法
文章目录 一.穷举法 定义 算法思路 算法优缺点 示例: 一.穷举法 定义 穷举法是算法设计中经常使用的一种方法,基本思想是问题的要求将问题的所有可能的输入一一进行验证,看是否满足问题的条件,从而找到 ...
- 第1-6课:算法设计常用思想之穷举法
这一课我们来介绍穷举法,有一些人把穷举法视为上不了台面的低级方法,这种想法是错误的,虽然穷举思想的原理简单,但是用穷举思想设计一个算法却一点也不简单.各种算法模式或思想没有高下之分,关键在于你是否能灵 ...
- 算法题解01——对分搜索求立方根
double x: scanf("%lf",&x): double cube: 暂且把输入的数命名为x,所求立方根为cube,要求精度为3位小数.我们来写一段代码求出它的立 ...
- 用java写的快速开平方根算法
用java编写的快速开平方根的精准算法 发布一个本人原创的求平方根的算法. 本算法不是穷举法,而是非常高效的一种算法. 具体思路是从第一位小数开始验证,找出最合适大小的数字: 然后找第二位小数,再第三 ...
最新文章
- 网络端口的分类和作用
- MyEclipse打不开 报xxxxxx. log。
- mahout in Action2.2-给用户推荐图书(2)-分析对用户推荐书目的结果
- linux-pcap 抓包程序框架
- 北京涛思数据获得 Pre A 轮融资,专注时序空间大数据领域
- python requests网页爬取初探
- linux模拟tcp测试工具,TCP测试小工具tcping for linux
- hadoop环境搭建总结
- iTextSharp 页面设置
- SpringCloud教程合集
- 从turtlesim到贪吃蛇……
- 1的阶乘加到100的阶乘
- svn服务器搭建ip指定,mac 局域网svn服务器搭建
- 18款最佳Bug跟踪管理系统
- JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK11特性讲解】
- 筋斗云接口编程 / 常用操作(二)
- 联想小新 win10电脑系统安装教程
- Linux驱动 | 加载.ko驱动模块的两种方法(insmod与modprobe)
- 汉字转化成拼音 汉字转化成拼音
- Argument of type ‘‘ is not assignable to parameter of type ‘never‘.
热门文章
- 【Docker容器】进入容器的2种方式
- Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)
- c++,为什么要引入虚拟继承
- FireEye:K3chang行动***欧洲外交部门
- C++中#和##的特殊使用
- J2ee项目环境搭建常用工具
- 使用 dom4j 解析 XML
- STM32学习笔记(十) CAN通讯测试(环回模式)
- Proj.4 API 中文参考
- Luogu1613 跑路