计算机开平方的三种算法
要学好计算机,就要学会像计算机一样思考。
对于一个数 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.光栅显示器:光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度 2.由来:随着光栅显示器的出现,为了在计算机上处理.显示 ...
- 爱因斯坦谜题解答(三种算法比较)
爱因斯坦谜题: 在一条街上有颜色互不相同的五栋房子,不同国籍的人分别住在这五栋房子力,每人抽不同品牌的香烟,喝不同的饮料,养不同的宠物.已知如下情况: 1. 英国人住红色房子里. 2. 瑞 ...
- 三种算法求解经典N皇后问题
三种算法求解经典N皇后问题 [问题描述] 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击, ...
- EL之DTRFGBT:基于三种算法(DT、RF、GBT)对泰坦尼克号乘客数据集进行二分类(是否获救)预测并对比各自性能
EL之DT&RF&GBT:基于三种算法(DT.RF.GBT)对泰坦尼克号乘客数据集进行二分类(是否获救)预测并对比各自性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核 ...
- java 求最大公因数_求最大公约数的三种算法(java实现)
三种算法: //欧几里得算法(辗转相除): public static int gcd(int m,int n) { if(m int k=m; m=n; n=k; } //if(m%n!=0) { ...
- SQL Server 索引基础知识(10)----Join 时的三种算法简介
我们书写查询语句的时候,Join 参数之前可以是下面三个 { LOOP | MERGE | HASH } JOIN . 如果不使用,则系统自己分析那种方式快,使用那种方式. 这其实是SQL Serv ...
- c语言求最小公倍数和最大公约数三种算法
C语言求最小公倍数和最大公约数三种算法(经典) 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b ...
- 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数
第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...
- C语言求最小公倍数和最大公约数三种算法(经典)
C语言求最小公倍数和最大公约数三种算法(经典) 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为 ...
- 【老生谈算法】matlab实现EKF UKF PF三种算法对比源码——EKF UKF PF算法
EKF UKF PF三种算法对比 matlab程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]EKF-UKF-PF三种算 ...
最新文章
- Batch Normalization的诅咒
- bios设置 联想m8000t_联想怎样设置双显卡模式 联想设置双显卡模式方法【详解】...
- 工智能遇上银行反欺诈,到底能帮什么忙
- 解放你的双手-Sql Server 2000智能提示工具[破解版]
- JS 一张图理解prototype、proto和constructor的关系
- 用WebView加载本地图片的方法
- guzz 1.3.0大版本发布,支持Spring事务
- 公布中秋福利中奖名单
- 等价类划分法测试用例设计举例
- 前端 实现 直角三角形 边长、角度计算工具
- 树莓派显示器分辨率的调整,黑边的修改方法
- 喜茶奶茶技术培训哪里学?
- html文档是哪个版本,HTML 简介, 版本和文档类型声明
- 前端实现电子签名(vue组件)
- Vbox虚拟机内在共享目录中创建软链接失败
- python指数、幂数拟合curve_fit
- Centos离线安装Kubernetes集群
- vc++ 读书笔记(摘抄)
- VAR模型与BP神经网络算法的简单实践
- java 制作简易日历_Java制作简单日历
热门文章
- echarts实现航线图,航运图
- Linux下压缩mp3文件
- sql的casewhen
- ijkplayer 自定义解码器
- word中插入高分辨率图片,并且保存为PDF图片仍然高清的方法
- 202206-2 寻宝!大冒险! CCF认证真题
- lomboz eclipse怎么连接oracle10,Lomboz插件的安装与配置[Eclipse 3.0,3.1.x与3.2.x版本]第一部分...
- 日语输入法 android8.0,百度日文输入法
- fedora 9 中英文相互兼容设置
- android 文件下载和保存