遇到了求立方根的题目,在此做一下算法笔记,

分析过程:

数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

求立方根算法--个人对立方根算法的穷举和优化相关推荐

  1. 求100以内素数的方法(筛选法,穷举法,穷举法优化)

    一.基本思想 //质数(素数)是指在大于1的自然数中除了1和它本身以外不再有其他因数的自然数. (1)判断一个数n是不是素数,可以用2到(int)sqrt(n)之间的所有整数去除n,看能否整除,如果都 ...

  2. 函数计算机求立方根,(在excel中如何求立方根值)excel中立方根公式

    怎么在EXCEL2007里输入立方根? 打开Microsoft Word,菜单-插入中有一个域,点选域-点选EQ-点选R公式编辑器,找到根号公式,写好后再copy到excel里面,不过copy过去的十 ...

  3. 算法设计思想(1)— 穷举法

    本文系 王晓华 老师 GitChat [算法应该怎么玩]课程笔记. 1. 穷举法概念 穷举法又称穷举搜索法,是一种在问题域的解空间中对所有可能的解穷举搜索,并根据条件选择最优解的方法的总称. 数学上也 ...

  4. c语言常用算法pdf,妙趣横生的算法(C语言实现 第2版) 带目录完整pdf[94MB]

    <妙趣横生的算法(C语言实现 第2版)>是深受广大读者好评的<妙趣横生的算法(C语言实现)>一书的全新升级版.本书在第1版的基础上对原书内容做了大量的调整和补充,并将书中的实例 ...

  5. 【算法】最直接的算法——穷举法详解

    第三章 穷举法 一.基本概念 穷举法又称为枚举法或者蛮力法,是一种简单直接解决问题的方法,常常是基于问题的直接描述去编写程序,比如说求n的阶乘,那么就直接一个循环n次的for循环. 穷举法依赖的基本技 ...

  6. 算法学习之模拟退火算法路径规划(python代码实现)

    模拟退火算法路径规划(python代码实现) 一.引言 二.算法介绍以及伪代码 1.算法通俗介绍 2.路径规划算法伪代码 三.算法流程及代码实现 1.地图创建 2.初始化路径 小结 3.计算适应度值 ...

  7. 常用算法回顾——穷举法

    文章目录 一.穷举法 定义 算法思路 算法优缺点 示例: 一.穷举法 定义 穷举法是算法设计中经常使用的一种方法,基本思想是问题的要求将问题的所有可能的输入一一进行验证,看是否满足问题的条件,从而找到 ...

  8. 第1-6课:算法设计常用思想之穷举法

    这一课我们来介绍穷举法,有一些人把穷举法视为上不了台面的低级方法,这种想法是错误的,虽然穷举思想的原理简单,但是用穷举思想设计一个算法却一点也不简单.各种算法模式或思想没有高下之分,关键在于你是否能灵 ...

  9. 算法题解01——对分搜索求立方根

    double x: scanf("%lf",&x): double cube: 暂且把输入的数命名为x,所求立方根为cube,要求精度为3位小数.我们来写一段代码求出它的立 ...

  10. 用java写的快速开平方根算法

    用java编写的快速开平方根的精准算法 发布一个本人原创的求平方根的算法. 本算法不是穷举法,而是非常高效的一种算法. 具体思路是从第一位小数开始验证,找出最合适大小的数字: 然后找第二位小数,再第三 ...

最新文章

  1. 网络端口的分类和作用
  2. MyEclipse打不开 报xxxxxx. log。
  3. mahout in Action2.2-给用户推荐图书(2)-分析对用户推荐书目的结果
  4. linux-pcap 抓包程序框架
  5. 北京涛思数据获得 Pre A 轮融资,专注时序空间大数据领域
  6. python requests网页爬取初探
  7. linux模拟tcp测试工具,TCP测试小工具tcping for linux
  8. hadoop环境搭建总结
  9. iTextSharp 页面设置
  10. SpringCloud教程合集
  11. 从turtlesim到贪吃蛇……
  12. 1的阶乘加到100的阶乘
  13. svn服务器搭建ip指定,mac 局域网svn服务器搭建
  14. 18款最佳Bug跟踪管理系统
  15. JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK11特性讲解】
  16. 筋斗云接口编程 / 常用操作(二)
  17. 联想小新 win10电脑系统安装教程
  18. Linux驱动 | 加载.ko驱动模块的两种方法(insmod与modprobe)
  19. 汉字转化成拼音 汉字转化成拼音
  20. Argument of type ‘‘ is not assignable to parameter of type ‘never‘.

热门文章

  1. 【Docker容器】进入容器的2种方式
  2. Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)
  3. c++,为什么要引入虚拟继承
  4. FireEye:K3chang行动***欧洲外交部门
  5. C++中#和##的特殊使用
  6. J2ee项目环境搭建常用工具
  7. 使用 dom4j 解析 XML
  8. STM32学习笔记(十) CAN通讯测试(环回模式)
  9. Proj.4 API 中文参考
  10. Luogu1613 跑路