手動開平方的一種方法


算法步奏:

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM