题目描述
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
观众老爷们,如果本思路对您有帮助,求关注一波~~~
思路
减法的思路(模拟数从后向前减)
初始化借位t = 0
计算加法t = a - b - t 其中a, b范围为(0,9), t为借位0 or 1,同时临时用来存储减法的结果
计算结果值 (t + 10)% 10 如果t为负的,比如-1,向前借一位,(10 - 1) = 9
如果t为正的,比如1,无需向前借一位,(10 + 1) % 10 = 1
计算借位值,用于下次计算 t = 0 or 1 如果t为负的,表示需要向前借一位(正好印证前面借位), t = 1
如果t为正的,无需向前借一位,t = 0
vector<int> C;
int t = 0; //借位
for(int i = 0; i < A.size(); i ++){
t = A[i] - t;
if(i < B.size()) t -= B[i];
//不借位(1 + 10) % 10 = 1 , 借位(-1 + 10) % 10 = 9
C.push_back((t + 10) % 10);
if(t < 0) t = 1;
else t = 0;
}
//针对995 - 993出现002的情况 保留一位2
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
java
import java.util.Scanner;
public class Main{
public static void main(String[] args){
String a, b;
Scanner sc = new Scanner(System.in);
a = sc.next();
b = sc.next();
char[] A = new char[a.length()], B = new char[b.length()];
for(int i = a.length() - 1; i >= 0; i --) A[a.length() - 1 - i] = a.charAt(i);
for(int i = b.length() - 1; i >= 0; i --) B[b.length() - 1 - i] = b.charAt(i);
if(cmp(A, B)){
String c = sub(A, B);
System.out.println(c);
}else{
String c = sub(B, A);
System.out.print("-");
System.out.println(c);
}
}
public static String sub(char[] A, char[] B){
StringBuffer sb = new StringBuffer();
int t = 0;
for(int i = 0; i < A.length; i ++){
t = A[i] - '0' - t; //注意要减去-'0'
if(i < B.length) t -= B[i] - '0';
sb.append((t + 10) % 10);
if(t < 0) t = 1;
else t = 0;
}
String s = sb.reverse().toString();
int i = 0;
for(; i < s.length() - 1; i ++)
if(s.charAt(i) != '0') break;
return s.substring(i, s.length());
// char[] C = sb.reverse().toString().toCharArray();
// //针对77 - 70 = 07 => 7 77 - 77 = 00 => 0
// //利用截取,来去除开头的0, 当全为0的时候保留1位0
// int i = 0; //记录开头位置不为0
// for(; i < C.length - 1; i ++)
// if(C[i] != '0') break;
// return new String(C).substring(i, C.length);
}
public static boolean cmp(char[] A, char[] B){
if(A.length != B.length) return A.length > B.length;
//相等从高位进行比较
for(int i = A.length - 1; i >= 0; i --){
if(A[i] != B[i]) return A[i] > B[i];
}
return true;
}
}
python
def compare(A, B):
if(len(A) != len(B)): return len(A) > len(B)
for i in range(len(A) - 1, -1, -1):
if(A[i] != B[i]): return A[i] > B[i]
return True;
def sub(A, B):
C = list()
t = 0
i = 0
while(i < len(A)):
t = A[i] - t
if(i < len(B)): t -= B[i]
C.append((t + 10) % 10)
if(t < 0): t = 1
else: t = 0
i += 1
i = 0
C = C[::-1]
while len(C) > 1 and C[0] == 0:
C.pop(0)
return C
def main():
a = list(map(int, input()))
b = list(map(int, input()))
#倒序写法一利用python特性
A = a[::-1]
B = b[::-1]
if(compare(A, B)):
res = sub(A, B)
print(''.join(map(str, res)))
else:
res = sub(B, A)
print('-' + "".join(map(str, res)))
main()
c++
#include <iostream>
#include <vector>
using namespace std;
//判断是否 A >= B
bool cmp(vector<int> &A, vector<int> &B){
if(A.size() != B.size()) return A.size() > B.size();
for(int i = A.size() - 1; i >= 0; i --){
if(A[i] != B[i])
return A[i] > B[i];
}
return true;
}
//C = A - B
vector<int> sub(vector<int> &A, vector<int> &B){
vector<int> C;
int t = 0; //借位
for(int i = 0; i < A.size(); i ++){
t = A[i] - t;
if(i < B.size()) t -= B[i];
//不借位(1 + 10) % 10 = 1 , 借位(-1 + 10) % 10 = 9
C.push_back((t + 10) % 10);
if(t < 0) t = 1;
else t = 0;
}
//针对995 - 993出现002的情况
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main(){
string a, b;
vector<int> A, B;
cin >> a >> b;
for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');
for(int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] - '0');
if(cmp(A, B)){
auto C = sub(A, B);
for(int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]);
}
else{
auto C = sub(B, A);
printf("-");
for(int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]);
}
return 0;
}
全能哥