要学好计算机,就要学会像计算机一样思考。

对于一个数 x = 9 ,求,你会毫不犹豫地回答3;如果 x = 784 ?你也能在第一时间说出答案吗?

计算机并不像人一样聪明,它只能按照事先规定好的步骤一步一步地进行, 我们称之为算法,算法的魅力就在于能够指导计算机快速精确地解决问题。

以下介绍三种开平方算法。

①穷举法(屎一样的算法,建议从后两个算法看起):

当人看到x = 9 ,求时,它会首先在大脑里搜索是否存在直接能用的结果,相信九九乘法表早已刻在你的脑子里,因此你会毫不犹豫地说出, = 3;但是当x = 784时,你的脑中不存在的直接储备,但是你记得25的平方与30的平方这两个节点,而784恰好处在625与900之间,因此,如果运气够好的话,只需要计算26、27、28、29的平方,当然,你的运气足够好, = 28.

好了,现在我们将784更换成744,你又如何做呢?显然经过计算你又知道了在27,28之间,是一个小数,因此你需要猜测,小数点后那一位究竟是多少。

现在,我们用代码模拟以上过程。需要解决以下几个问题:

①为了让计算机快速找到解区间,你需要一个乘法表来存储各个关键节点,那么这个表应该多大呢?如果一个好事者输入了10位整数,我们的计算机能够存储那么大的乘法表吗?

既然这样,不如利用计算机的优势,当场算出相应的区间就好。

②猜测的小数后一位应该是多少呢?

既然找到了区间,不如设定一个步长假设为0.1,依次计算区间内的数据。(27.1,27.2,27.3······)

显然步长越小,计算次数越多。

③计算机无法精确表达浮点数,只能通过设置误差a来确定是否取值(abs(i^2) - x < a),这时你惊奇的发现

27.2^2 = 739.84

27.3^2 = 745.29

因此误差a至少要取到1.29,如果我们设置a = 1,那么就无法得到答案。

如果步长与误差设置不合适,很可能计算机会跳过正确的解。

以上的问题搞得人焦头烂额,让人感觉像食屎一样。

因此很不负责任地得到以下代码(Python为例)

x = int(input("请输入一个数字:"))
i = 0const = 0
while(i**2 < x):i+=1const+=1
i -= 1
while(i**2<x):i+=0.01const+=1
print("sqrt(x) = %f,const = %d"%(i,const))

当输入x = 15   sqrt(x) = 3.880000,const = 92

当x = 1928332946    sqrt(x) = 43912.790000,const = 43992

②:二分法

实际上,对于一个数x,其解必定在(0,x)之间,那么将x/2作为猜测值,若大了,说明解在区间(0,x/2)之间,若小了,说明解在区间(x/2,x)。

x = float(input("请输入数字:"))
left = 0.0
right = x
a = 0.001
i = x/2
const = 0                   #计步
while(abs(i**2 - x) > a):   #当i^2与x误差小于0.001,退出循环if(i**2 - x < 0):left = ii +=(right-left)/2   #如果真实解在右侧区间,则更新i为新区间中点const+=1else:right = ii -=(right-left)/2    #如果真实解在左侧区间,更新i为新区间中点const+=1
print("sqrt(x) = %f,const = %d"%(i,const))

当x = 15,sqrt(x) = 3.872910,const = 15

x = 1928332946,sqrt(x) = 43912.787955,const = 55

可见精度与运算速度均有极大提高。(算法的魅力)

③牛顿法(姑且这么称呼):

根据牛顿的理论

对于多项式 P(x) = a*(x^n)+b*(x^(n-1))+c*(x^(n-2))······

若存在近似值r,使得P(r)≈ 0,那么 r - P(r)/P'(r) 的值将比 r 更加接近 真实解 的值。

那么如何使用呢?

对于求24的平方根,我们可以设P(x)=x^2 - 24,那么P‘(x) = 2*x

这样对于近似值r,设置r = r - (r^2-24)/2*r,这样不断迭代,就可以更加快速地得到近似值。

代码如下:

x = float(input("请输入数字:"))
i = x/2
a = 0.0001       #注意这里误差为二分法的0.1倍
const = 0        #计步
while(abs(i**2 - x) > 0.001):i = i - ((i**2-x)/(2*i))const+=1
print("sqrt(x) = %f,const = %d"%(i,const))

当 x = 15 ,sqrt(x) = 3.872983,const = 4

当x = 1928332946,sqrt(x) = 43912.787955,const = 19

代码更加简洁,精度与运算速度再次提高!

计算机开平方的三种算法相关推荐

  1. 计算机图形学(三种画线算法)

    第二章:光栅图形学算法 1.光栅显示器:光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度 2.由来:随着光栅显示器的出现,为了在计算机上处理.显示 ...

  2. 爱因斯坦谜题解答(三种算法比较)

    爱因斯坦谜题:     在一条街上有颜色互不相同的五栋房子,不同国籍的人分别住在这五栋房子力,每人抽不同品牌的香烟,喝不同的饮料,养不同的宠物.已知如下情况: 1.  英国人住红色房子里. 2.  瑞 ...

  3. 三种算法求解经典N皇后问题

    三种算法求解经典N皇后问题 [问题描述] 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击, ...

  4. EL之DTRFGBT:基于三种算法(DT、RF、GBT)对泰坦尼克号乘客数据集进行二分类(是否获救)预测并对比各自性能

    EL之DT&RF&GBT:基于三种算法(DT.RF.GBT)对泰坦尼克号乘客数据集进行二分类(是否获救)预测并对比各自性能 目录 输出结果 ​设计思路 核心代码 输出结果 设计思路 核 ...

  5. java 求最大公因数_求最大公约数的三种算法(java实现)

    三种算法: //欧几里得算法(辗转相除): public static int gcd(int m,int n) { if(m int k=m; m=n; n=k; } //if(m%n!=0) { ...

  6. SQL Server 索引基础知识(10)----Join 时的三种算法简介

    我们书写查询语句的时候,Join 参数之前可以是下面三个 { LOOP | MERGE | HASH } JOIN  . 如果不使用,则系统自己分析那种方式快,使用那种方式. 这其实是SQL Serv ...

  7. c语言求最小公倍数和最大公约数三种算法

    C语言求最小公倍数和最大公约数三种算法(经典) 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b ...

  8. 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数

    第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...

  9. C语言求最小公倍数和最大公约数三种算法(经典)

    C语言求最小公倍数和最大公约数三种算法(经典) 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为 ...

  10. 【老生谈算法】matlab实现EKF UKF PF三种算法对比源码——EKF UKF PF算法

    EKF UKF PF三种算法对比 matlab程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]EKF-UKF-PF三种算 ...

最新文章

  1. Batch Normalization的诅咒
  2. bios设置 联想m8000t_联想怎样设置双显卡模式 联想设置双显卡模式方法【详解】...
  3. 工智能遇上银行反欺诈,到底能帮什么忙
  4. 解放你的双手-Sql Server 2000智能提示工具[破解版]
  5. JS 一张图理解prototype、proto和constructor的关系
  6. 用WebView加载本地图片的方法
  7. guzz 1.3.0大版本发布,支持Spring事务
  8. 公布中秋福利中奖名单
  9. 等价类划分法测试用例设计举例
  10. 前端 实现 直角三角形 边长、角度计算工具
  11. 树莓派显示器分辨率的调整,黑边的修改方法
  12. 喜茶奶茶技术培训哪里学?
  13. html文档是哪个版本,HTML 简介, 版本和文档类型声明
  14. 前端实现电子签名(vue组件)
  15. Vbox虚拟机内在共享目录中创建软链接失败
  16. python指数、幂数拟合curve_fit
  17. Centos离线安装Kubernetes集群
  18. vc++ 读书笔记(摘抄)
  19. VAR模型与BP神经网络算法的简单实践
  20. java 制作简易日历_Java制作简单日历

热门文章

  1. echarts实现航线图,航运图
  2. Linux下压缩mp3文件
  3. sql的casewhen
  4. ijkplayer 自定义解码器
  5. word中插入高分辨率图片,并且保存为PDF图片仍然高清的方法
  6. 202206-2 寻宝!大冒险! CCF认证真题
  7. lomboz eclipse怎么连接oracle10,Lomboz插件的安装与配置[Eclipse 3.0,3.1.x与3.2.x版本]第一部分...
  8. 日语输入法 android8.0,百度日文输入法
  9. fedora 9 中英文相互兼容设置
  10. android 文件下载和保存