高精度運算

2021-04-22 14:57:53 字數 2673 閱讀 7615

/*

name: 高精度運算

author: goal00001111

date: 01-12-08 15:04

description:

高精度運算:加減乘除,乘方,階乘

*/#include

#include

using namespace std;

void reverse(string & str);

void addint(string & c, string a, string b);

void subint(string & c, string a, string b);

void mulint(string & c, string a, string b);

void jiechint(string & c, string b);

void divint(string & c, string a, string b);

void powint(string & c, string a, string b);

int main()

void reverse(string & str)

}void addint(string & c, string a, string b)//模仿遞增向量的合併方法

while (i < a.size())

while (i < b.size())

while (carry > 0)//計算進製部分

i = c.size() - 1;

while (c[i] == '0')//消除多餘的高位0

c = c.substr(0, i+1);

reverse(c);

}void subint(string & c, string a, string b)//模仿遞增向量的合併方法

bool flag = false;

if (a.size() < b.size() || (a.size() == b.size() && a < b))//交換,並得到乙個負號

reverse(a);

reverse(b); ;

int i = 0;

while (i < b.size())

i++;

}while (i < a.size())

c += a[i];

i++;

}i = c.size() - 1;

while (c[i] == '0')//消除多餘的高位0

c = c.substr(0, i+1);

if (flag)

c += '-';

reverse(c);

}void mulint(string & c, string a, string b)

reverse(a);

reverse(b);

string ta, tb, tc;

int carry = 0;

for (int i=0; i 0)//計算進製部分

//累加到c中

ta = c;

reverse(ta);

reverse(tc);

addint(c, ta, tc);

reverse(c);

//消除多餘的高位0

int pos = c.size() - 1;

while (c[pos] == '0')

c = c.substr(0, pos+1);

}reverse(c);

}void jiechint(string & c, string b)

}void divint(string & c, string a, string b)

string copya = a;//儲存a的值,之後a的值會變化

while (a == b || a.size() > b.size() || (a.size() == b.size() && a > b))//直到餘數小於除數

if (ta == b)//相等,商為1,被除數去掉前n位

else if (ta.size() > b.size() || (ta.size() == b.size() && ta > b))//被除數不小於除數

if (ta == tb)//整除

else//餘數不為0

}else//被除數小於除數,商為0 }}

while (copya.size() > c.size())//補足低位的0

c += '0';

//消除多餘的高位0

int pos = 0;

while (pos < c.size() && c[pos] == '0')

c = c.substr(pos, c.size()-pos);

if (c.size() == 0)//商為0

c = "0";

}void powint(string & c, string a, string b)

if (b == "0")

if (b == "1")

string tb;

divint(tb, b, "2");

powint(c, a, tb);

mulint(c, c, c);

if ((b[b.size()-1]-'0')%2 == 1)

mulint(c, c, a);

}

高精度運算

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

高精度運算

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

高精度運算

資料讀入,加減乘除,階乘,取餘。不支援負數。乘除只支援大整數和小整數的運算。包括了所有已知的演算法競賽當中的大數運算。這應該是迭代比較完美的一代了,終於完成了高精度模板,繼續加油!const int maxlen 1005 struct bigint j num j 1 digit j bigint...