c语言大数相加的算法思想,求两个大数相加,相减,相乘的基本思路或者算法.解决思路...

C/C++ code#include

#include

using namespace std;

inline int compare(string str1, string str2) {

if(str1.size() > str2.size()) //长度长的整数大于长度小的整数

return 1;

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

return -1;

else

return str1.compare(str2); //若长度相等,从头到尾按位比较,compare函数:相等返回0,大于返回1,小于返回-1

}

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

string SUB_INT(string str1, string str2);

int sign = 1; //sign 为符号位

string str;

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

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

sign = -1;

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

} else {

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

}

} else {

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

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

else {

//把两个整数对齐,短整数前面加0补齐

string::size_type l1, l2;

int i;

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

if(l1 < l2) {

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

str1 = "0" + str1;

} else {

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

str2 = "0" + str2;

}

int int1 = 0, int2 = 0; //int2 记录进位

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

int1 = (int(str1[i]) - '0' + int(str2[i]) - '0' + int2) % 10;

int2 = (int(str1[i]) - '0' + int(str2[i]) - '0' +int2) / 10;

str = char(int1 + '0') + str;

}

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

}

}

//运算后处理符号位

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

str = "-" + str;

return str;

}

string SUB_INT(string str1, string str2) {//高精度减法

string MUL_INT(string str1, string str2);

int sign = 1; //sign 为符号位

string str;

int i;

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(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] + ':') + str;

} else

str = char(str1[i + tempint] - str2[i] + '0') + 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;

}

string MUL_INT(string str1, string str2) {//高精度乘法

int sign = 1; //sign 为符号位

string str;

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

sign *= -1;

str1 = str1.erase(0, 1);

}

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

sign *= -1;

str2 = str2.erase(0, 1);

}

int i, j;

string::size_type l1, l2;

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

for(i = l2 - 1; i >= 0; i --) { //实现手工乘法

string tempstr;

int int1 = 0, int2 = 0, int3 = int(str2[i]) - '0';

if(int3 != 0) {

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

tempstr = "0" + tempstr;

for(j = l1 - 1; j >= 0; j--) {

int1 = (int3 * (int(str1[j]) - '0') + int2) % 10;

int2 = (int3 * (int(str1[j]) - '0') + int2) / 10;

tempstr = char(int1 + '0') + tempstr;

}

if(int2 != 0) tempstr = char(int2 + '0') + tempstr;

}

str = ADD_INT(str, tempstr);

}

//去除结果中的前导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;

}

string DIVIDE_INT(string str1, string str2, int flag) {//高精度除法

//flag = 1时,返回商; flag = 0时,返回余数

string quotient, residue; //定义商和余数

int sign1 = 1, sign2 = 1;

if(str2 == "0") { //判断除数是否为0

quotient = "ERROR!";

residue = "ERROR!";

if(flag == 1) return quotient;

else return residue;

}

if(str1 == "0") { //判断被除数是否为0

quotient = "0";

residue = "0";

}

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

str1 = str1.erase(0, 1);

sign1 *= -1;

sign2 = -1;

}

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

str2 = str2.erase(0, 1);

sign1 *= -1;

}

int res = compare(str1, str2);

if(res < 0) {

quotient = "0";

residue = str1;

} else if(res == 0) {

quotient = "1";

residue = "0";

} else {

string::size_type l1, l2;

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

string tempstr;

tempstr.append(str1, 0, l2 - 1);

//模拟手工除法

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

tempstr = tempstr + str1[i];

tempstr.erase(0, tempstr.find_first_not_of('0'));//zhao4zhong1添加

if(tempstr.empty()) tempstr = "0";//zhao4zhong1添加

for(char ch = '9'; ch >= '0'; ch --) { //试商

string str;

str = str + ch;

if(compare(MUL_INT(str2, str), tempstr) <= 0) {

quotient = quotient + ch;

tempstr = SUB_INT(tempstr, MUL_INT(str2, str));

break;

}

}

}

residue = tempstr;

}

//去除结果中的前导0

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

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

if((sign1 == -1) && (quotient[0] != '0'))

quotient = "-" + quotient;

if((sign2 == -1) && (residue[0] != '0'))

residue = "-" + residue;

if(flag == 1) return quotient;

else return residue;

}

string DIV_INT(string str1, string str2) {//高精度除法,返回商

return DIVIDE_INT(str1, str2, 1);

}

string MOD_INT(string str1, string str2) {//高精度除法,返回余数

return DIVIDE_INT(str1, str2, 0);

}

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 = SUB_INT(s1, s2); break;

case '*': res = MUL_INT(s1, s2); break;

case '/': res = DIV_INT(s1, s2); break;

case '%': res = MOD_INT(s1, s2); break;

default : break;

}

cout << res << endl;

}

return(0);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值