1.大数加法模板
//大数加法模板
string add(string s1, string s2) {
if(s1.length() < s2.length()) { //确保s1的位数永远大于等于s2的位数
string temp = s1;
s1 = s2;
s2 = temp;
}
int i, j;
for(i=s1.length()-1, j=s2.length()-1; i>=0; --i, --j) {
s1[i] = char(s1[i] + (j>=0? s2[j]-'0': 0)); //处理了s1,s2位数不同的情况和相同的情况
if(s1[i] - '0' >= 10) { //当出现进位的时候
s1[i] = char((s1[i] - '0')%10 + '0');
if(i) ++s1[i-1];
else s1 = '1' + s1; //解决当加到最高位有进位的时候
}
}
return s1;
}
//大数减法模板 没有处理输出问题,比如如果结果是001,会打印出001,而不是1
string subtration(string s1, string s2) { //确保s1永远大于等于s2,目的是为了方便后面运算
if(s1.length() < s2.length() || (s1.length() == s2.length() && s1[0] < s2[0])) { //确保s1的位数永远大于等于s2的位数
string temp = s1;
s1 = s2;
s2 = temp;
}
int i, j;
for(i=s1.length()-1, j=s2.length()-1; i>=0; --i, --j) {
if(s1[i] >= s2[j]) { //不需要借位,够减
s1[i] = char(s1[i] - (j>=0? s2[j] - '0': 0));
}
else { //需要借位,不够减
s1[i] = char(s1[i] + 10 - (j>=0? s2[j] - '0': 0));
if(i) --s1[i-1];
}
}
return s1;
}
//大数乘以一个只有一位的正数, 对于001这种情况没处理,打印的时候打印001,不是1
string multi(string s1, int a) {
int i, j;
char up = '0';
for(i=s1.length()-1; i>=0; --i) {
s1[i] = (s1[i] - '0') * a + up;
if(s1[i] - '0' >= 10) {
up = (s1[i] - '0') / 10 + '0';
s1[i] = (s1[i] - '0') % 10 + '0';
if(i==0) s1 = up + s1;
}
}
return s1;
}