其他高精度算法如下:
高精度減法【c++實現(xiàn)】
高精度乘法【c++實現(xiàn)】
高精度除法【c++實現(xiàn)】
——————————————————————————————
說在前面:
眾所周知 int,long,long long 的能力是有限制的,具體見下表:
然而現(xiàn)實中的數(shù)字是可以非常大的,大到 long long 都裝不下,這個時候如果對兩個這樣的數(shù)字進行加減乘除顯然是 long long 都無能為力了。欸!那該怎么辦呢?
這時候,就到了我們的高精度算法發(fā)光發(fā)熱的時候啦!
這里先說高精度加法的實現(xiàn):
首先要明確的一點是,高精度加法就是在模擬現(xiàn)實中加法計算的方法而已,用數(shù)組的一位存儲數(shù)字的一位,把兩個數(shù)字一位一位的相加,當兩位數(shù)相加再加進位的數(shù)字大于等于10的時候就要進位,同時當前位只保留個位數(shù),保證每一位只有一個數(shù)字。(可以自己列個豎式感受一下easy)
需要解決的一些問題:
例如:976+515=1491
如果像這個樣子存兩個數(shù)子的話就會發(fā)現(xiàn)一個問題,因為我們要保證數(shù)組的每一位只有一個數(shù)字,那ans的進位沒有地方放了啊(總不能不要了吧)
再例如:976+5151=6127
這種情況下,因為 num1 和 num2 沒有對齊位,所以相加的時候也不好處理 num1 的哪一位加 num2 的哪一位。
解決方法:
976+5151=6127
于是乎,我們就要把 num1 和 num2 倒著存進數(shù)組里,這樣就順利的解決了對齊問題和進位問題??!【鼓掌】【鼓掌】【鼓掌】
那么現(xiàn)在進入正題:
思路:
#include#includeusing namespace std;
int main(){int num1[520]={0},num2[520]={0},ans[520]={0};//自己根據(jù)需要定義整形數(shù)組的大小
int temp,i,j; //temp是用來存進位的數(shù)字的
char num1c[520]={0},num2c[520]={0};//接受數(shù)字時用的字符數(shù)組
cin>>num1c>>num2c; //接收兩個數(shù)字到字符數(shù)組(這是還是正向的)
int len1=strlen(num1c); //計算num1的長度
int len2=strlen(num2c); //計算num2的長度
//將兩個字符型的數(shù)字 倒序存到對應整型數(shù)組里 (記得減字符‘0’)
//數(shù)字低位---------------->數(shù)字高位
for(i=len1-1;i>=0;i--){num1[len1-1-i]=num1c[i]-'0';
}
for(i=len2-1;i>=0;i--){num2[len2-1-i]=num2c[i]-'0';
}
//計算兩個數(shù)字的和
//循環(huán)的時候可以全部過一遍,也可以根據(jù)兩個數(shù)字的位數(shù)和進位來決定(循環(huán)次數(shù)會少一些)
//但我們要充分相信計算機的能力(bushi)
for(i=0;i<=520;i++){ans[i]=num2[i]+num1[i]+temp;//求和
temp=ans[i]/10;//ans[i]如果大于10就進位
ans[i]%=10;//ans[i]取個位數(shù)
}
len2++;//最高位加 1 防止漏掉最后的進位
//當數(shù)字總位數(shù)大于1時,去掉開頭的0
//不要全都去掉哦,不然0+0就沒有輸出了
while(ans[len2]==0&&len2>0) len2--;
//倒序打印出來就是答案了?。。?!
for(i=len2;i>=0;i--){cout<
結果發(fā)現(xiàn)非常成功?。?!【撒花】【撒花】【撒花】
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧