Question:给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
方法一:位数相同条件下比较字符串大小函数 自己定义
#include<iostream>
#include<cstring>
using namespace std;
const int N = 10000010;
char s1[N], s2[N],tmp[N];//为负数 则用tmp数组交换两个数组
int a[N], b[N], c[N];
bool cmp(int length)
{
for(int i = 0; i <=length-1; i -- )
if (s1[i] != s2[i])
return s1[i] > s2[i];
return true;
}
int main()
{
cin >> s1>>s2;
int len1 = strlen(s1);
int len2 = strlen(s2);
if ((len1<len2) || (len1==len2 && cmp(len1)==0)) {
//被减数小于减数,结果为负数
printf("-");
strcpy(tmp, s1);
strcpy(s1, s2);
strcpy(s2, tmp);
//更新长度数据
len1 = strlen(s1);
len2 = strlen(s2);
}
for (int i = len1 - 1,j=0; i >= 0; i--,j++)
a[j] = s1[i]-'0';
for (int i = len2 - 1,j=0; i >= 0; i--,j++)
b[j] = s2[i]-'0';
for (int i=0; i<len1; i++) {
if (a[i]<b[i]) {
//有借位
a[i+1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
for (int i = len1 - 1; i >= 0; i--)
{
//因为我们是从索引 0 开始,所以最高位是保存在 len-1
if (0 == c[i] && len1 > 1)
{
//注意要有 len1>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
len1--;
}
else
{
//第一个不是零的最高位,结束删除
break;
}
}
//逆序打印输出
for (int i=len1-1; i>=0; i--) {
printf("%d", c[i]);
}
printf("\n");
return 0;
}
方法二:使用strcmp函数
#include<iostream>
#include<cstring>
using namespace std;
const int N = 10000010;
char s1[N], s2[N],tmp[N];//为负数 则用tmp数组交换两个数组
int a[N], b[N], c[N];
bool cmp(int length)
{
for(int i = 0; i <=length-1; i -- )
if (s1[i] != s2[i])
return s1[i] > s2[i];
return true;
}
int main()
{
cin >> s1>>s2;
int len1 = strlen(s1);
int len2 = strlen(s2);
if ((lena<lenb) || (lena==lenb && strcmp(s1,s2)<0)){
//被减数小于减数,结果为负数
printf("-");
strcpy(tmp, s1);
strcpy(s1, s2);
strcpy(s2, tmp);
//更新长度数据
len1 = strlen(s1);
len2 = strlen(s2);
}
for (int i = len1 - 1,j=0; i >= 0; i--,j++)
a[j] = s1[i]-'0';
for (int i = len2 - 1,j=0; i >= 0; i--,j++)
b[j] = s2[i]-'0';
for (int i=0; i<len1; i++) {
if (a[i]<b[i]) {
//有借位
a[i+1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
for (int i = len1 - 1; i >= 0; i--)
{
//因为我们是从索引 0 开始,所以最高位是保存在 len-1
if (0 == c[i] && len1 > 1)
{
//注意要有 len1>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
len1--;
}
else
{
//第一个不是零的最高位,结束删除
break;
}
}
//逆序打印输出
for (int i=len1-1; i>=0; i--) {
printf("%d", c[i]);
}
printf("\n");
return 0;
}