算法步奏:
1)將給定的需要數兩位一段分成若干段,個位、十位作為一段,其他往左往右兩位一段;
2)求平方根的最左位,取分段的最左段作為被減數,依次將1、3、7、9、11、13…作為減數,直到減到最小非負為止;
3)求平方根的第二位,將上一步減法最后一次減法的余數r作為此輪被減數的左半部分,右半部分是第二段的兩位數ab,即被減數為rab;上一輪最后一次減法的減數+1得到c作為此輪減數的左半部分,右半部分為1、3、5、7、9、11…,即減數為c1、c3、c5、c7、…,直至減到最小非負為止;
4)重復步驟3),求平方根的下一位;
5)當得到的余數為0或所有段處理完時計算結束。
例子:對80315.56開平方運算
第一步:將所給數分段,個位、十位(如果有的話)作為一段;再依次往左往右每兩位作為一段。80315.56被分成四段,8、03、15、56,再按以下規則施行一系列減法依次確定所給數平方根的每一位;
第二步:確定平方根的最左位,此例的最左段為8,將其作為被減數,依次用減數1、3、5、7、9、11、13、15、17…來減它。8-1=7,7-3=4,再往下4-5已無法進行,故此輪能有效施行的減法運算次數僅為2,從而確定80315.56的平方根的最左位是2;
第三步:確定平方根的第二位(靠左),將上一步減法最后余數(4)添上下一段兩位數(03)構成本輪的被減數(即403),而減數的結構由上一輪有效施行的減法的最后一次的減數(3)加上1(得4)作為本輪減數的最左位,減數的右半部分依次由1(得41)、3(得43)、5(得45)、7(得47)、9(得49)、11(得51)…構成。於是有以下減法運算:403-41=362、362-43=319、319-45=274、274-47=227、227-49=178、178-51=127、127-53=74、74-55=19,至此再往下已無法進行,此輪有效施行了8次減法,可確定平方根第二位為8;
第四步:確定下一位,將上一步減法最后余數(19)添入下一段兩位數(15)構成本輪被減數1915;而減數由上一輪最后一次減法的減數55加一(56)構成最左位,右部分由1、3、5、7、9、11、…構成,於是有如下減法運算:1915-561=1354、1354-563=791、791-565=226,已無法往下運算,此輪有效減法為3次,所以確定平方根此位為3;
第五步:確定下一位,將上一步減法最后余數(226)添到下一段兩位數(56)構成本輪被減數22656;而減數由上一輪最后一次減法的減數565加1(566)作為其最左位,右部分由1、3、5、7、9、11…構成。於是有如下運算:22656-5661=20995、20995-5663=15332、15332-5665=5667、5667-5667=0,結束,此輪有效減法4次,可確定平方根此位為4;
第六步:在對應位上添加小數點,得到80315.56的平方根283.4。
Raptor流程圖:
① main程序
② posOfPoint子程序
③ getIntegerPart子程序
④ getDecimalPart子程序

⑤ strlen子程序

⑥ calculate子程序

⑦ calOneDigit子程序

⑧ print子程序
C++程序:
1 #include <stack> 2 #include <queue> 3 #include <stdio.h> 4 #include <string.h> 5 #include <math.h> 6 using namespace std; 7 8 stack<int> integerPart; 9 queue<int> decimalPart; 10 void initData(); 11 void posOfPoint(const char num[], int &p); 12 void getIntegerPart(const char num[], const int p); 13 void getDecimalPart(const char num[], const int p); 14 void calculate(char res[], int &k); 15 16 int main() 17 { 18 char num[100]; 19 char res[100]; 20 int p, k, i; 21 22 gets(num); 23 posOfPoint(num, p); 24 getIntegerPart(num, p); 25 getDecimalPart(num, p); 26 calculate(res, k); 27 for(i=0; i<k; i++) 28 printf("%c", res[i]); 29 printf("\n"); 30 31 return 0; 32 } 33 34 void posOfPoint(const char num[], int &p) 35 { 36 for(p=0; num[p]!=0; p++) 37 { 38 if(num[p]=='.') 39 break; 40 } 41 } 42 43 void getIntegerPart(const char num[], const int p) 44 { 45 for(int i=p-1; i>=0; i--) 46 { 47 int t = num[i] - '0'; 48 i -= 1; 49 if(i>=0) 50 t += (num[i] - '0') * 10; 51 integerPart.push(t); 52 } 53 } 54 55 void getDecimalPart(const char num[], const int p) 56 { 57 int len = strlen(num); 58 if(p>=len) 59 return ; 60 61 for(int i=p+1; i<len; i++) 62 { 63 int t = num[i] - '0'; 64 i += 1; 65 if(i<len) 66 t = t * 10 + (num[i] - '0'); 67 else 68 t *= 10; 69 decimalPart.push(t); 70 } 71 } 72 73 void calOneDigit(__int64 &r, __int64 &t, char res[], int &k) 74 { 75 r = (r + 1) * 10; 76 for(int i=0; ; i++) 77 { 78 if(t-(r+2*i+1)>=0) 79 t -= r + 2 * i + 1; 80 else 81 { 82 res[k++] = i + '0'; 83 r = r + 2 * i - 1; 84 break; 85 } 86 } 87 } 88 89 void calculate(char res[], int &k) 90 { 91 __int64 t = 0; 92 __int64 r = -1; 93 k = 0; 94 95 while(!integerPart.empty()) 96 { 97 t = t * 100 + integerPart.top(); 98 integerPart.pop(); 99 calOneDigit(r, t, res, k); 100 } 101 if(t!=0 || !decimalPart.empty()) 102 { 103 res[k++] = '.'; 104 int m = 0; 105 while(t!=0 || !decimalPart.empty()) 106 { 107 if(!decimalPart.empty()) 108 { 109 t = t * 100 + decimalPart.front(); 110 decimalPart.pop(); 111 } 112 else 113 t *= 100; 114 calOneDigit(r, t, res, k); 115 m++; 116 if(m>=15) 117 break; 118 } 119 } 120 }
