高精度模板(算法必备)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

高精度计算模板

注意:减法、除法要用到compare函数

乘法需要加法的部分,加法需要减法部分

#include

#include

using namespace std;

int compare(string str1, string str2)

{

if(str1.size() > str2.size())

return 1;

else if(str1.size() < str2.size())

return -1;

else

return pare(str2);

}

int main()

{

char ch;

string s1, s2, res;

while(cin >> ch) {

cin >> s1>> s2;

switch(ch) {

case '+': res = ADD_INT(s1, s2); break; //高精度加法

case '-': res = MINUS_INT(s1, s2); break; //高精度减法

case '*': res = MULTIPLY_INT(s1, s2); break; //高精度乘法

case '/': res = DIV_INT(s1, s2); break; //高精度除法,返回商

case 'm': res = MOD_INT(s1, s2); break; //高精度除法,返回余数 default : break;

}

cout << res<< endl;

}

return(0);

}

string ADD_INT(string str1, string str2)

{

string MINUS_INT(string str1, string str2);

int sign = 1;

string str;

if(str1[0] == '-') {

if(str2[0] == '-') {

sign = -1;

str = ADD_INT(str1.erase(0, 1), str2.erase(0, 1));

}else {

str = MINUS_INT(str2, str1.erase(0, 1));

}

}else {

if(str2[0] == '-')

str = MINUS_INT(str1, str2.erase(0, 1));

else {

string::size_type l1, l2;

int i;

l1 = str1.size(); l2 = str2.size();

if(l1 < l2) {

for(i = 1; i <= (int)(l2 - l1); i++)

str1 = "0" + str1;

}else {

for(i = 1; i <= (int)(l1 - l2); i++)

str2 = "0" + str2;

}

int int1 = 0, int2 = 0;

for(i = str1.size() - 1; i >= 0; i--) {

int1 = (int(str1[i]) - 48 + int(str2[i]) - 48 + int2) %10; int2 = (int(str1[i]) - 48 + int(str2[i]) - 48 +int2) / 10; str = char(int1 + 48) + str;

}

if(int2 != 0) str = char(int2 + 48) + str;

}

}

//运算后处理符号位

if((sign == -1) && (str[0] !='0'))

str = "-" + str;

return str;

}

string MINUS_INT(string str1, string str2)

{

string MULTIPLY_INT(string str1, string str2);

int i,sign = 1;

string str;

if(str2[0] == '-')

str = ADD_INT(str1, str2.erase(0, 1));

else {

int res = compare(str1, str2);

if(res == 0) return "0";

if(res < 0) {

sign = -1;

string temp = str1;

str1 = str2;

str2 = temp;

}

string::size_type tempint;

tempint = str1.size() - str2.size();

for(int i = str2.size() - 1; i >= 0; i--) {

if(str1[i + tempint] < str2[i]) {

str1[i + tempint - 1] = char(int(str1[i + tempint - 1]) - 1); str = char(str1[i + tempint] - str2[i] + 58) + str;

}

else

str = char(str1[i + tempint] - str2[i] + 48) + str;

}

for(i = tempint - 1; i >= 0; i--)

str = str1[i] + str;

}

//去除结果中多余的前导0

str.erase(0, str.find_first_not_of('0'));

if(str.empty()) str = "0";

if((sign == -1) && (str[0] !='0'))

str = "-" + str;

return str;

}

相关文档
最新文档