在說高精度加減乘除運算之前,我們先搞明白什麼是高精度運算?
實際上高精度就是說參與運算的資料和運算結果的範圍,超出標準資料型別能表示的資料大小範圍的運算。這個時候,如果要得到正確的計算結果,顯然不能依靠普通方法實現了。而要在普通運算原理的基礎上,加以輔助演算法來實現超大資料的計算。例如:求兩個100位的資料的和,或者計算兩個100位的數字乘積。這時就要用到高精度演算法了。
一、高精度加法:
高精度加法的實現原理:
1、計算結果的位數
358934760892734899共18位
38960302975237462共17位
故結果不會超過19位。
2、將要計算的數字分割成多段,按照順序排列(這裡以0-32767作為每一儲存單位儲存的數的限制):
(為提高空間利用效率,可以乙個儲存單位儲存多位數。)
3、將兩數相加。
4、輸出結果。
從高位到低位依次輸出。除最高位以外,其他低位上不足4位的要在前面補上0。
5.**實現如下
#include#includeusing namespace std;
int main()
len++; //下面是去掉最高位的0,然後輸出。
while((a[len]==0)&&(len>1)) len--;
for(i=len;i>=1;i--)
cout<
//注意:兩個數相加,結果的位數,應該比兩個數中大的那個數多一位。
二、高精度減法:
高精度減法的實現原理:
1.高精度減法相比高精度加法來說,稍微複雜一點,因為減法在差為負數時處理的細節更多一點:當被減數小於減數時,差為負數,差的絕對值是減數減去被減數;在程式實現上用乙個變數來儲存符號位,用另乙個陣列存差的絕對值。
2.實現流程
(1).先比較大小
(2).決定輸出符號,為正還是為負
(3).按位減法,並注意處理借位
3.**實現如下:
#includeusing namespace std;
int compare(string s1,string s2);
int main()
} a[0]++;
while((a[a[0]]==0)&&(a[0]>1)) a[0]--;
for(i=a[0];i>=1;i--)
cout<1)) b[0]--;
for(i=b[0];i>=1;i--)
coutif(s1.length()s2[i]) return 0;
if(s1[i]
三、高精度乘法實現
高精度乘法實現原理:
1.由於數字較大,無法使用簡單的資料結構進行儲存,選用陣列和字串來儲存數字,字串方便我們對於高位整數的輸入,而整形陣列的簡便有利於每個位數的計算,結合兩者優點便可實現高精度乘法。
2.實現過程:
(1).通過兩個字串輸入兩個整數
(2).引入兩個陣列,將每個整數切割儲存到陣列裡面
(3).進行每一位的運算
(4).處理進製
(5).輸出結果
3.**實現如下:
#include#includeusing namespace std;
int main()
len=a[0]+b[0]+1; //去掉最高位的0,然後輸出
while((c[len]==0)&&(len>1)) len--; //為什麼此處要len>1??
for(i=len;i>=1;i--)
cout<
四、高精度除法實現
高精度除法實現原理:高精度除法這一塊比較複雜,它可以分為兩種情況:
第一種情況:高精除以低精,實際上就是對被除的每一位,包括前面的餘數都除以除數。
**實現如下:
#include#include#includeusing namespace std;
int main()
lenc=1;
while (c[lenc]==0&&lenc
第二種情況:高精除以高精
**實現如下:
#include#includeusing namespace std;
int a[100],b[100],c[100];
int compare(int a,int b)//比較a、b,若a>b為1;若ab[0])
return 1;
if(a[0]0;i--)//從高位到低位比較
}int main()
}while(c[0]>0&&c[c[0]]==0)//刪除前導0
c[0]--;
cout<<"商為:";
if(c[0]==0)//輸出結果
cout<<0<0;i--)
cout<0;i--)
cout《原作者為:
高精度演算法,加減乘除
高精度演算法的兩個基本問題 高精度數的表示和高精度數的基本運算 1.高精度數的表示 首先我想到的是do while 迴圈逆序存放在陣列之中,但書中用string接受並且將其轉化成數字,存放在陣列之中 int arr 100 string str cin str int len str.length ...
高精度演算法(加減乘除)
最近開始學習解決大數問題,在這裡記錄下自己的學習情況。問題描述 我有乙個非常簡單的問題。給定兩個整數a和b,你的工作是計算a b的和。輸入 輸入的第一行包含整數t 1 t 20 表示測試用例的數量。然後是t行,每行包含兩個正整數,a和b.請注意,整數非常大,這意味著您不應該使用32位整數來處理它們。...
高精度演算法(加減乘除)
在遇到一些例如1e 100000這樣的資料的時候,我們無法處理,那麼我們需要高精度來處理,用long long都沒有辦法處理,利用高精度處理方法是用字串的手法處理。高精度加法 思路 就是我們人類的加法,從最小位數開始,先算好以後再進行進製操作即可,考慮進製的問題。include using name...