從此搞定高精度運算,超詳細講解

2021-10-02 14:38:07 字數 1989 閱讀 2197

要點: 首先要將低位放在陣列的頭部, 其次就是要注意進製, 然後就是模仿小學的列豎式計算嘍!

這裡強調一下預處理的步驟, 即讀入這麼乙個大數, 你可以用c++中的string, 也可以用c中的char陣列, 其實都是一樣的, 感覺我自己沒有講清楚, 我還是來給一給具體的實現作一下參考吧.

//用string

string str1, str2;

cin >> str1 >> str2;

這時你已經將這兩個數以字串的形式存起來了, 然後你就可以從字串的最後面進行計算

string add(string str1,string str2)//高精度加法

if(cf!=0) str=char(cf+'0')+str;

return str;

}

char a[50001], a1[50001];

cin >> a1;

a[0] = strlen(a1);

for (int i = 1; i <= a[0]; i++)

對於高精度減法而言就要複雜很多, 首先你得考慮可能是乙個小數減去乙個大數的問題, 其次你得考慮借位的問題, 最後你要考慮去除前導0的問題, 比如10001 - 10000 = 00001你得去除這幾個前導0, 最後, 你還得注意0 應該輸出0;
#include using namespace std;

int a[10100], b[10100], res[10100], maxl;

bool flag = false;//這個是同來標記是否需要加負號

//這個函式的作用是用來判斷減數與被減數誰大

int cmp (string str1, string str2) else if (str1.length() < str2.length()) else

}string sub(string str1, string str2) else

}for (int i = tmp - 1; i >= 0; i--) else

}str.erase(0,str.find_first_not_of('0'));//去除結果中多餘的前導0

return str;

}int main() else if (cmp(a, b) < 0) else

return 0;

}

這個需要注意的地方也是前導0和進製而已, 這裡介紹乙個下處理技巧, 考慮我們平時的豎式乘法, 我們會發現對於乘數1的第i位與乘數2的第j位相乘會對結果的第i + j - 1位作出貢獻, 這麼說吧, 結果的第k位是兩個乘數的第ij位(滿足i + j - 1 == k)作出貢獻(先不考慮進製的問題)用**描述是這樣的

for (i=1;i<=a[0];++i)for (j=1;j<=b[0];++j)c[i+j-1]+=a[i]*b[j];
考慮進製後整體的**是這樣的

#include#includeusing namespace std;

char a1[50001],b1[50001];

int a[50001],b[50001],i,x,len,j,c[50001];

int main ()

//進製

while (c[len]==0&&len>1)len--;//判斷位數

for (i=len;i>=1;--i)cout

}

高精度運算

今天覆習了一下高精度運算。我覺得這種簡單的東西也得看一看,至少給自己留點兒低!高精度可以壓位的,但我今年懶得寫了 首先是加減法很簡單了,沒什麼值得特別強調的。高精度減法時別忘了,a時做下交換在計算,輸出時別忘了標記負號。高精度乘法需要注意的問題是,要在做完乘法之後再調整為十進位制。有的初學者小盆友喜...

高精度運算

雖說高精度直接考查的越來越少,不過還是以防萬一。define maxlen 1000 struct bint 本模板既可輸入字串,也可輸入整數 bint int t if len 1 len bint char str print number friend void print bint bi p...

高精度運算

name 高精度運算 author goal00001111 date 01 12 08 15 04 description 高精度運算 加減乘除,乘方,階乘 include include using namespace std void reverse string str void addin...