- 这是洛谷上的一道原题(题目链接)P2142 高精度减法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
- 这道题我用的是c++解法,定义的头文件较多,头文件如下:
#include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; #define maxn 10010
定义变量:
int len1,len2; int a[maxn],b[maxn]; string s1,s2;
交换函数:
void swap(string &a,string &b) { string t; t=a; a=b; b=t; }
对2个数组的长度和大小比较的函数:
-
bool compare(string a,string b) { if(a.size()<b.size()) return true; if(a.size()>b.size()) return false; for(int i=0;i<a.size();i++){ if(a[i]>b[i]) return false; if(b[i]>a[i]) return true; } return false; }
主函数部分(通过添加减号调用函数直接求数组长度和利用循环输出结果):
int main() { cin>>s1; cin>>s2; if(compare(s1,s2)){ swap(s1,s2); putchar('-'); } len1=s1.size(); len2=s2.size(); for(int i=0;i<len1;i++) a[len1-i]=s1[i]-'0'; for(int i=0;i<len2;i++) b[len2-i]=s2[i]-'0'; for(int i=1;i<=len1;i++){ a[i]-=b[i]; if(a[i]<0) { a[i+1]--; a[i]+=10; } } while(a[len1]==0&&len1>1) len1--; for(int i=len1;i>=1;--i) printf("%d",a[i]); return 0; }
- 整体代码如下:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 10010
int len1,len2;
int a[maxn],b[maxn];
string s1,s2;
void swap(string &a,string &b)
{
string t;
t=a;
a=b;
b=t;
}
bool compare(string a,string b)
{
if(a.size()<b.size()) return true;
if(a.size()>b.size()) return false;
for(int i=0;i<a.size();i++){
if(a[i]>b[i]) return false;
if(b[i]>a[i]) return true;
}
return false;
}
int main()
{
cin>>s1;
cin>>s2;
if(compare(s1,s2)){
swap(s1,s2);
putchar('-');
}
len1=s1.size();
len2=s2.size();
for(int i=0;i<len1;i++) a[len1-i]=s1[i]-'0';
for(int i=0;i<len2;i++) b[len2-i]=s2[i]-'0';
for(int i=1;i<=len1;i++){
a[i]-=b[i];
if(a[i]<0) {
a[i+1]--;
a[i]+=10;
}
}
while(a[len1]==0&&len1>1) len1--;
for(int i=len1;i>=1;--i)
printf("%d",a[i]);
return 0;
}