l根的算法
Ⅰ 根号的算法啊
我“定义”a^b=a的b次方。
(10a+b)^2
=
100a^2+20ab+b^2
=
100a^2+b(20a+b)
a代表的是已经计算出来的结果,b代表的是当前需要计算的位上的数。在每次计算过程中,100a^2都被减掉,剩下b(20a+b)。然后需要做的就是找到最大的整数b'使b'(20a+b')<=b(20a+b)。
因此,我就照着书里的方法,推导开立方笔算法。
(10a+b)^3
=
1000a^3+300a^2*b+30a*b^2+b^3
=
1000a^3+b[300a^2+b(30a+b)]
如果每次计算后都能减掉1000a^3的话,那么剩下的任务就是找到最大的整数b',使b'[300a^2+b'(30a+b')]<=b[300a^2+b(30a+b)]。
于是,我就设计了一个版式。下面就开始使用这个版式来检验开立方笔算法。
例如:147^3=3176523
一开始,如下图所示,将3176523从个位开始3位3位分开。(3'176'523)
第一步,我们知道,1^3
<
3
<
2^3,所以,第一位应该填1。
1^3
=
1,3
-
1
=
2,余2,再拖三位,一共是2176。
接下来这一步就比较复杂了。因为我水平有限,我现在还不能把它改造得比较好。
依照“b[300a^2+b(30a+b)]”,所以:
1^2*300=300,1*30=30,如图上所写。
第二位就填4,所以上图3个空位都填4。
然后(34*4+300)*4=1744,2176-1744=432,再拖三位得432523。
然后就照上面一样,
14^2*300=58800,14*30=420,如上图所写。
第三位就填7,所以上图下边3个空位都填7。
然后(427*7+58800)*7=432523,432523-432523=0,到此开立方结束。
在我以后的一些实践中,发现越往后开,300*a^2与b(30a+b)的差距就越大,寻找b的工作就越容易,因为结果中有一项是300*a^2*b。
徒手开n次方根的方法:
原理:设被开方数为X,开n次方,设前一步的根的结果为a,现在要试根的下一位,设为b,
则有:(10*a+b)^n-(10*a)^n<=c(前一步的差与本段合成);且b取最大值
用纯文字描述比较困难,下面用实例说明:
我们求
2301781.9823406
的5次方根:
第1步:将被开方的数以小数点为中心,向两边每隔n位分段(下面用'表示);不足部分在两端用0补齐;
23'01781.98234'06000'00000'00000'..........
从高位段向低位段逐段做如下工作:
初值a=0,差c=23(最高段)
第2步:找b,条件:(10*a+b)^n-(10*a)^n<=c,即b^5<=23,且为最大值;显然b=1
差c=23-b^5=22,与下一段合成,
c=c*10^n+下一段=22*10^5+01781=2201781
第3步:a=1(计算机语言赋值语句写作a=10*a+b),找下一个b,
条件:(10*a+b)^n-(10*a)^n<=c,即:(10+b)^5-10^5<=2201781,
b取最大值8,差c=412213,与下一段合成,
c=c*10^5+下一段=412213*10^5+98234=41221398234
第4步:a=18,找下一个b,
条件:(10*a+b)^n-(10*a)^n<=c,即:(180+b)^5-180^5<=41221398234,
b取最大值7
说明:这里可使用近似公式估算b的值:
当10*a>>b时,(10*a+b)^n-(10*a)^n≈n*(10*a)^(n-1)*b,即:
b≈41221398234/n/(10*a)^(n-1)=41221398234/5/180^4≈7.85,取b=7
以下各步都更加可以使用此近似公式估算b之值
差c=1508808527;与下一段合成,
c=c*10^5+下一段=1508808527*10^5+06000=150880852706000
第5步:a=187,找下一个b,
条件:(10*a+b)^n-(10*a)^n<=c,即:
(1870+b)^5-1870^5<=150880852706000,
b取最大值2,差c=28335908584368;与下一段合成,
c=c*10^5+下一段=2833590858436800000
第6步:a=1872,找下一个b,
条件:(10*a+b)^n-(10*a)^n<=c,即:
(18720+b)^5-18720^5<=2833590858436800000,
b取最大值4,差c=376399557145381376;与下一段合成,
c=c*10^5+下一段=37639955714538137600000
.............................
最后结果为:18.724......
Ⅱ 开根号的计算方法(手工计算)
任意数开立方根笔算步骤如下:
1、把所求数从右往左每3位分一段分成若干段,从左往右开始计算.
2、先从最左边一段开始计算。用试算法得出这段的得数(该得数要取其立方不溢出所求数第一段上的数时的最大数)设该得数为a
3、把第一段所求数与a^3的差,在其后面按位补上第二段的数,为第二段要算的数(所求数),取一个试算数b,在计算纸的其它地方第一行写上3a^2,第二行往右移一位写上3ab,第三行往右移一位写上b^2,用竖式加法算出这三行数的和(上面两行数,相应空位补上0).用这个和乘以试算数b所得的积与该段所求数进行比较.试算出最大的b(积不溢出所求数),该数b即为第二段上的得数.把该得数写在算式相应段的上方。
4、相同的方法进行下一段的计算,所不同的是a要取前面已算出的得数,(如前面两位得数分别是1,3,a就取13,如算到第四段,前面三位数分别是1,3,5,a就取135,)试算出相应的b写在该段上方。
5、算到最后一段,如最后试算出来的余数不为0,则说明所求数的立方根不是整数,此时,用与求开方相似的方法,在该数后面补一段000,再算出的得数就是小数点后的第一位数,还有余数,再补三位0,只到余数为0或者至算至足够的小数位即可。
6、该算法写出来似乎很烦,但实际计算时并不复杂。可能会化点时间。当然,这都是在没有办法以的情况下才会用笔算进行开立方的。
希望对你有帮助。
Ⅲ 二叉树遍历的算法实现
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
⑴访问结点本身(N),
⑵遍历该结点的左子树(L),
⑶遍历该结点的右子树(R)。
以上三种操作有六种执行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
注意:
前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。 根据访问结点操作发生位置命名:
① NLR:前序遍历(PreorderTraversal亦称(先序遍历))
——访问根结点的操作发生在遍历其左右子树之前。
② LNR:中序遍历(InorderTraversal)
——访问根结点的操作发生在遍历其左右子树之中(间)。
③ LRN:后序遍历(PostorderTraversal)
——访问根结点的操作发生在遍历其左右子树之后。
注意:
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。 1.先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
2.中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。 用二叉链表做为存储结构,中序遍历算法可描述为:
void InOrder(BinTree T)
{ //算法里①~⑥是为了说明执行过程加入的标号
① if(T) { // 如果二叉树非空
② InOrder(T->lchild);
③ printf(%c,T->data); // 访问结点
④ InOrder(T->rchild);
⑤ }
⑥ } // InOrder 计算中序遍历拥有比较简单直观的投影法,如图
⑴在搜索路线中,若访问结点均是第一次经过结点时进行的,则是前序遍历;若访问结点均是在第二次(或第三次)经过结点时进行的,则是中序遍历(或后序遍历)。只要将搜索路线上所有在第一次、第二次和第三次经过的结点分别列表,即可分别得到该二叉树的前序序列、中序序列和后序序列。
⑵上述三种序列都是线性序列,有且仅有一个开始结点和一个终端结点,其余结点都有且仅有一个前驱结点和一个后继结点。为了区别于树形结构中前驱(即双亲)结点和后继(即孩子)结点的概念,对上述三种线性序列,要在某结点的前驱和后继之前冠以其遍历次序名称。
【例】上图所示的二叉树中结点C,其前序前驱结点是D,前序后继结点是E;中序前驱结点是E,中序后继结点是F;后序前驱结点是F,后序后继结点是A。但是就该树的逻辑结构而言,C的前驱结点是A,后继结点是E和F。
二叉链表基本思想
基于先序遍历的构造,即以二叉树的先序序列为输入构造。
注意:
先序序列中必须加入虚结点以示空指针的位置。
【例】
建立上图所示二叉树,其输入的先序序列是:ABD∮∮∮CE∮∮F∮∮。
构造算法
假设虚结点输入时以空格字符表示,相应的构造算法为:
void CreateBinTree (BinTree **T){ //构造二叉链表。T是指向根指针的指针,故修改*T就修改了实参(根指针)本身 char ch; if((ch=getchar())=='') *T=NULL; //读入空格,将相应指针置空 else{ //读人非空格 *T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点 (*T)->data=ch; CreateBinTree(&(*T)->lchild); //构造左子树 CreateBinTree(&(*T)->rchild); //构造右子树 }}
注意:
调用该算法时,应将待建立的二叉链表的根指针的地址作为实参。
示例
设root是一根指针(即它的类型是BinTree),则调用CreateBinTree(&root)后root就指向了已构造好的二叉链表的根结点。
二叉树建立过程见
下面是关于二叉树的遍历、查找、删除、更新数据的代码(递归算法): #include<iostream>#include<cstdio>#include<cmath>#include<iomanip>#include<cstdlib>#include<ctime>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<list>#include<stack>#include<queue>#include<map>#include<set>usingnamespacestd;typedefintT;classbst{structNode{Tdata;Node*L;Node*R;Node(constT&d,Node*lp=NULL,Node*rp=NULL):data(d),L(lp),R(rp){}};Node*root;intnum;public:bst():root(NULL),num(0){}voidclear(Node*t){if(t==NULL)return;clear(t->L);clear(t->R);deletet;}~bst(){clear(root);}voidclear(){clear(root);num=0;root=NULL;}boolempty(){returnroot==NULL;}intsize(){returnnum;}TgetRoot(){if(empty())throwemptytree;returnroot->data;}voidtravel(Node*tree){if(tree==NULL)return;travel(tree->L);cout<<tree->data<<'';travel(tree->R);}voidtravel(){travel(root);cout<<endl;}intheight(Node*tree){if(tree==NULL)return0;intlh=height(tree->L);intrh=height(tree->R);return1+(lh>rh?lh:rh);}intheight(){returnheight(root);}voidinsert(Node*&tree,constT&d){if(tree==NULL)tree=newNode(d);elseif(ddata)insert(tree->L,d);elseinsert(tree->R,d);}voidinsert(constT&d){insert(root,d);num++;}Node*&find(Node*&tree,constT&d){if(tree==NULL)returntree;if(tree->data==d)returntree;if(ddata)returnfind(tree->L,d);elsereturnfind(tree->R,d);}boolfind(constT&d){returnfind(root,d)!=NULL;}boolerase(constT&d){Node*&pt=find(root,d);if(pt==NULL)returnfalse;combine(pt->L,pt->R);Node*p=pt;pt=pt->R;deletep;num--;returntrue;}voidcombine(Node*lc,Node*&rc){if(lc==NULL)return;if(rc==NULL)rc=lc;elsecombine(lc,rc->L);}boolupdate(constT&od,constT&nd){Node*p=find(root,od);if(p==NULL)returnfalse;erase(od);insert(nd);returntrue;}};intmain(){bstb;cout<<inputsomeintegers:;for(;;){intn;cin>>n;b.insert(n);if(cin.peek()=='
')break;}for(;;){cout<<inputdatapair:;intod,nd;cin>>od>>nd;if(od==-1&&nd==-1)break;b.update(od,nd);}}
Ⅳ 根号运算法则
√a+√b=√b+√a√a-√b=-(√b-√a)√a*√b=√(a*b)√a/√b=√(a/b)
Ⅳ 开根号算法
1.电脑:打开“计算器”,输入1.213,再在“Inv”框前打勾,按x^y,按5,最后按“=”。
科学计算器:根据各种型号来定。
2.输入1.213,按x^y,输入0.2,就可以了。因为一个数开5次方根就是它的0.2次方(0.2是5的倒数)
5√1.213=1.03937474538
Ⅵ 根号怎么算
1、√ab=√a·√b﹙a≥0b≥0﹚ 这个可以交互使用.这个最多运用于化简,如:√8=√4·√2=2√2
2、√a/b=√a÷√b﹙a≥0b﹥0﹚
3、√a²=|a|(其实就是等于绝对值)这个知识点是二次根式重点也是难点。当a>0时,√a²=a(等于它的本身);当a=0时,√a²=0;当a<0时,√a²=-a(等于它的相反数)
4、分母有理化:分母不能有二次根式或者不能含有二次根式。当分母中只有一个二次根式,那么利用分式性质,分子分母同时乘以相同的二次根式。如:分母是√3,那么分子分母同时乘以√3。
当分母中含有二次根式,利用平方差公式使分母有理化。具体方法,如:分母是√5 -2(表示√5与2的差)要使分母有理化,分子分母同时乘以√5+2(表示√5与2的和)
(6)l根的算法扩展阅读
在实数范围内,偶次根号下不能为负数,其运算结果也不为负。奇次根号下可以为负数。不限于实数,即考虑虚数时,偶次根号下可以为负数,利用【i=√-1】即可
参考资料
网络-根号
Ⅶ 数学公式根号怎么计算
从个位起向左每隔两位为一节,若带有小数从小数点起向右每隔两位一节,用“,”号将各节分开; 2.求不大于左边第一节数的完全平方数,为“商”; 3.从左边第一节数里减去求得的商,在它们的差的右边写上第二节数作为第一个余数; 4.把商乘以20,试除第一个余数,所得的最大整数作试商(如果这个最大整数大于或等于10,就用9或8作试商); 5.用商乘以20加上试商再乘以试商。如果所得的积小于或等于余数,就把这个试商写在商后面,作为新商;如果所得的积大于余数,就把试商逐次减小再试,直到积小于或等于余数为止; 6.用同样的方法,继续求。 上述笔算开方方法是我们大多数人上学时课本附录给出的方法,实际中运算中太麻烦了。我们可以采取下面办法,实际计算中不怕某一步算错!!!而上面方法就不行。 比如136161这个数字,首先我们找到一个和136161的平方根比较接近的数,任选一个,比方说300到400间的任何一个数,这里选350,作为代表。 我们计算0.5*(350+136161/350)得到369.5 然后我们再计算0.5*(369.5+136161/369.5)得到369.0003,我们发现369.5和369.0003相差无几,并且,369^2末尾数字为1。我们有理由断定369^2=136161 一般来说能够开方开的尽的,用上述方法算一两次基本结果就出来了。再举个例子:计算469225的平方根。首先我们发现600^2<469225<700^2,我们可以挑选650作为第一次计算的数。即算 0.5*(650+469225/650)得到685.9。而685附近只有685^2末尾数字是5,因此685^2=469225 对于那些开方开不尽的数,用这种方法算两三次精度就很可观了,一般达到小数点后好几位。 实际中这种算法也是计算机用于开方的算法
Ⅷ 中学根号l到根号l0怎么计算
具体如下:
若a_=b,那么a是b开n次方的n次方根或a是b的1/n次方。根号是用来表示对一个数或一个代数式进行开方运算的符号。
根号计算公式:(n√a)n=a成立条件:a≥0,n≥2且n∈N。
n√an=|a︱成立条件:a≥0,n≥2且n∈N。
n√an√b=n√ab成立条件:a≥0,b>0,n≥2且n∈N。
n√a/n√b=n√a/b成立条件:a≥0,b>0,n≥2且n∈N。
如:5的平方等于25,99的平方等于9801。5的立方是125,25的立方是15625。把25,9801挂上二次方根号,就说明25,9801要开平方,开出的平方根就是5,99。把125和15625挂上三次方根号,就说明125和15625要开立方根,开出的立方根数就是5和25。具体方法很多,有因式分解法、竖式开方法等。如求面积、体积等方面用到这种计算方法。