大整数相减;相比于大整数相加,大整数相减多了一个比大小和最后输出时再次将int型数组转化成字符串的形式进行输出;
#include <bits/stdc++.h>
using namespace std;
const int maxn = 210;//固定数组的大小;
string yunsuan(char *s1, char *s2){
int a[maxn], b[maxn];
memset(a, 0, sizeof(a));//a,b数组的初始化;
memset(b, 0, sizeof(b));//
int len1 = strlen(s1), len2 = strlen(s2);
int maxLen = max(len1, len2);
for (int i = 0; i < len1; i++) a[i] = s1[len1 - i - 1] - '0';//将a,b数组的值倒序输入至整型数组内;
for (int i = 0; i < len2; i++) b[i] = s2[len2 - i - 1] - '0';
for (int i = 0; i < maxLen; i++) {
if (a[i] - b[i] < 0) {
a[i] = a[i] + 10 - b[i];
a[i + 1] -= 1;
}
else a[i] -= b[i];
}
string str = "";
int i;
for (i = maxLen - 1; i >= 0; i--)if (a[i] != 0)break;//除去前导零
for (; i >= 0; i--)str += a[i] + '0';//再次将字符int型整型数组转化成字符串的形式;
return str;
}
string bidaxiao(char *s1, char *s2) {//这一部分用于比较两数值的大小,看是谁减谁;
if (strcmp(s1,s2)==0)return "0"; //两个数相等,直接返回零;
int len1 = strlen(s1), len2 = strlen(s2);
if (len1 > len2)
return yunsuan(s1, s2);
else if (len1 < len2)
return "-" + yunsuan(s2, s1); //负数
else { //长度相等时判断大小
for (int i = 0; i < len1; i++) {
if (s1[i] - '0' > s2[i] - '0')
return yunsuan(s1, s2);
else if (s1[i] - '0' < s2[i] - '0')
return "-" + yunsuan(s2, s1);
}
}
}
int main() {
char s1[maxn],s2[maxn];
scanf("%s\n%s",s1,s2);
cout << bidaxiao(s1,s2) <<endl;
return 0;
}
总之,
1.根据题意确定maxn的值;const int maxn;
2.定义两个int型数组来储存两个大整数,并用memset(变量名称,初始化的值,sizeof(变量名称))进行初始化;
3.用a[i]进行运算后数值的储存,都是到最大位;
4.重点部分::::定义一个string,从最高位开始a[maxn-1]往下找,直到找出不为零的一位结束,继续从不为零的那一位开始str+=a[i]+‘0’;此时的str即是结果;
5.判断部分主要是长度相等时,从s1[0]即最高位开始比较s1[i]-‘0’;
现在已是凌晨一点,室友都睡了,感觉有用的话,给点个赞吧;
温馨提示:《《《仅适用于大正整数的相减》》》