【转】
#include <iostream>
#include <string>
using namespace std;
inline int compare(string str1, string str2)
{
if(str1.size() > str2.size()) //长度长的整数大于长度小的整数
return ;
else if(str1.size() < str2.size())
return -;
else
return str1.compare(str2); //若长度相等,从头到尾按位比较,compare函数:相等返回0,大于返回1,小于返回-1
}
//高精度加法
string ADD_INT(string str1, string str2)
{
string MINUS_INT(string str1, string str2);
int sign = ; //sign 为符号位
string str;
if(str1[] == '-') {
if(str2[] == '-') {
sign = -;
str = ADD_INT(str1.erase(, ), str2.erase(, ));
}else {
str = MINUS_INT(str2, str1.erase(, ));
}
}else {
if(str2[] == '-')
str = MINUS_INT(str1, str2.erase(, ));
else {
//把两个整数对齐,短整数前面加0补齐
string::size_type l1, l2;
int i;
l1 = str1.size(); l2 = str2.size();
if(l1 < l2) {
for(i = ; i <= l2 - l1; i++)
str1 = "" + str1;
}else {
for(i = ; i <= l1 - l2; i++)
str2 = "" + str2;
}
int int1 = , int2 = ; //int2 记录进位
for(i = str1.size() - ; i >= ; i--) {
int1 = (int(str1[i]) - + int(str2[i]) - + int2) % ; //48 为 '0' 的ASCII码
int2 = (int(str1[i]) - + int(str2[i]) - +int2) / ;
str = char(int1 + ) + str;
}
if(int2 != ) str = char(int2 + ) + str;
}
}
//运算后处理符号位
if((sign == -) && (str[] != ''))
str = "-" + str;
return str;
}
//高精度减法
string MINUS_INT(string str1, string str2)
{
string MULTIPLY_INT(string str1, string str2);
int sign = ; //sign 为符号位
string str;
if(str2[] == '-')
str = ADD_INT(str1, str2.erase(, ));
else {
int res = compare(str1, str2);
if(res == ) return "";
if(res < ) {
sign = -;
string temp = str1;
str1 = str2;
str2 = temp;
}
string::size_type tempint;
tempint = str1.size() - str2.size();
for(int i = str2.size() - ; i >= ; i--) {
if(str1[i + tempint] < str2[i]) {
str1[i + tempint - ] = char(int(str1[i + tempint - ]) - );
str = char(str1[i + tempint] - str2[i] + ) + str;
}
else
str = char(str1[i + tempint] - str2[i] + ) + str;
}
for(i = tempint - ; i >= ; i--)
str = str1[i] + str;
}
//去除结果中多余的前导0
str.erase(, str.find_first_not_of(''));
if(str.empty()) str = "";
if((sign == -) && (str[] != ''))
str = "-" + str;
return str;
}
//高精度乘法
string MULTIPLY_INT(string str1, string str2)
{
int sign = ; //sign 为符号位
string str;
if(str1[] == '-') {
sign *= -;
str1 = str1.erase(, );
}
if(str2[] == '-') {
sign *= -;
str2 = str2.erase(, );
}
int i, j;
string::size_type l1, l2;
l1 = str1.size(); l2 = str2.size();
for(i = l2 - ; i >= ; i --) { //实现手工乘法
string tempstr;
int int1 = , int2 = , int3 = int(str2[i]) - ;
if(int3 != ) {
for(j = ; j <= (int)(l2 - - i); j++)
tempstr = "" + tempstr;
for(j = l1 - ; j >= ; j--) {
int1 = (int3 * (int(str1[j]) - ) + int2) % ;
int2 = (int3 * (int(str1[j]) - ) + int2) / ;
tempstr = char(int1 + ) + tempstr;
}
if(int2 != ) tempstr = char(int2 + ) + tempstr;
}
str = ADD_INT(str, tempstr);
}
//去除结果中的前导0
str.erase(, str.find_first_not_of(''));
if(str.empty()) str = "";
if((sign == -) && (str[] != ''))
str = "-" + str;
return str;
}
//高精度除法
string DIVIDE_INT(string str1, string str2, int flag)
{
//flag = 1时,返回商; flag = 0时,返回余数
string quotient, residue; //定义商和余数
int sign1 = , sign2 = ;
if(str2 == "") { //判断除数是否为0
quotient = "ERROR!";
residue = "ERROR!";
if(flag == ) return quotient;
else return residue;
}
if(str1 == "") { //判断被除数是否为0
quotient = "";
residue = "";
}
if(str1[] == '-') {
str1 = str1.erase(, );
sign1 *= -;
sign2 = -;
}
if(str2[] == '-') {
str2 = str2.erase(, );
sign1 *= -;
}
int res = compare(str1, str2);
if(res < ) {
quotient = "";
residue = str1;
}else if(res == ) {
quotient = "";
residue = "";
}else {
string::size_type l1, l2;
l1 = str1.size(); l2 = str2.size();
string tempstr;
tempstr.append(str1, , l2 - );
//模拟手工除法
for(int i = l2 - ; i < l1; i++) {
tempstr = tempstr + str1[i];
for(char ch = ''; ch >= ''; ch --) { //试商
string str;
str = str + ch;
if(compare(MULTIPLY_INT(str2, str), tempstr) <= ) {
quotient = quotient + ch;
tempstr = MINUS_INT(tempstr, MULTIPLY_INT(str2, str));
break;
}
}
}
residue = tempstr;
}
//去除结果中的前导0
quotient.erase(, quotient.find_first_not_of(''));
if(quotient.empty()) quotient = "";
if((sign1 == -) && (quotient[] != ''))
quotient = "-" + quotient;
if((sign2 == -) && (residue[] != ''))
residue = "-" + residue;
if(flag == ) return quotient;
else return residue;
}
//高精度除法,返回商
string DIV_INT(string str1, string str2)
{
return DIVIDE_INT(str1, str2, );
}
//高精度除法,返回余数
string MOD_INT(string str1, string str2)
{
return DIVIDE_INT(str1, 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();
}