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。具體方法很多,有因式分解法、豎式開方法等。如求面積、體積等方面用到這種計算方法。