有会c++大哥吗?做一下这道题,不要use printf,scanf.
题目描述:输入一个高精度数和一个低精度数,(高精度数的数位不超过200)计算高精度数减去低精度数的差。
样例输入:
1111111111111111111
22
样例输出:
1111111111111111089 展开
/*
一般运算数位数超过19,就要考虑用高精度算法,就是用字符串输入,再用数组存储数位;
然后两个数组模拟数学运算,得出结果
高精度方面C/C++手写算法有儿复杂。
Java,Python,用专门的高精度运算方法,写起来精小强悍;
有兴趣可以了解一下
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 2e4;
string s1, s2;
int cmp(string s1, string s2) { //判断大小
if (s1.length() > s2.length()) {
return 1;
} else if (s1.length() < s2.length()) {
return 2;
} else if (s1 == s2) {
return 0;
} else {
for (int i = s1.length(); i >= 0; i--) {
if (s1[i] > s2[i]) {
return 1;
}
}
return 2;
}
}
void sub(int a[],int b[],int &len){//大数相减
int k=0;
int t=0;
for(int i=0;i<len;i++){//a-b
a[i+1]--;
a[i]=10+a[i]-b[i]+t;
t=a[i]/10;
a[i]%=10;
}
for(int i=len-1;i>=0;i--){//求前导0的个数
if(a[i]>0){
break;
}
k++;
}
len-=k;//减去前导0的位数
}
void print(int a[],int len){//输出
for(int i=len-1;i>=1;i--){
cout<<a[i];
}
}
void solve() {
int len1 = 0, len2 = 0;
int a[N] = {0}, b[N] = {0};
for (int i = s1.length(); i >= 0; i--) {
a[len1++] = s1[i] - '0';//字符串转化为数字数组
}
for (int i = s2.length(); i >= 0; i--) {
b[len2++] = s2[i] - '0';//字符串转化为数字数组
}
if (cmp(s1, s2) == 0) {//两个数相等
cout << 0 << endl;
} else if (cmp(s1, s2) == 1) {//第一个数大
sub(a,b,len1);//a-b
print(a,len1);//打印结果
} else if (cmp(s1, s2) == 2) {//第二个数大
sub(b,a,len2);//b-a
cout<<"-";//输出负号
print(b,len2);//打印结果
}
}
int main() {
cin >> s1 >> s2;//输入两个大数(以字符串的形式)
solve();// 操作函数
return 0;
}