废话少说
先看题目
高精度减法 |
|
长度不超过100位!
用long long也不行!!!
那我们该怎么办!
这时候
我们很容易(bushi)想到
我们可以用字符串来模拟啊!
别说100位,82位都不在话下(这我知道qwq)
所以
让我们来看看怎么模拟!
在此之前
先介绍一个函数
atoi(字符串的名字.c_str())
可以将字符串转化为整数
这里我们必须 大减小
不然很麻烦
那么
我们只要这么写
if((atoi(s1.c_str())<atoi(s2.c_str()) && s1.size()==s2.size())|| s1.size()<s2.size()) {
flag=1;
swap(s1,s2);}
‘’‘’‘’
if(flag==1) cout<<"-";
就解决了这个问题
接下来减法还有一个退位的问题
在总程序里有
比较好理解
话不多说
上程序
#include<bits/stdc++.h>
using namespace std;
const int qwq=105; //QWQ
int flag,a[qwq],b[qwq],c[qwq],lena,lenb;
int main(){
string s1,s2;
cin>>s1>>s2;
if((atoi(s1.c_str())<atoi(s2.c_str()) && s1.size()==s2.size())|| s1.size()<s2.size()) {//看前面
flag=1;
swap(s1,s2);}
lena=s1.size(); //在交换过以后在赋值lena,lenb
lenb=s2.size();
for(int i=0;i<lena;i++) a[lena-i-1]=s1[i]-'0'; //将字符转化为数字
for(int i=0;i<lenb;i++) b[lenb-i-1]=s2[i]-'0'; //对齐
int ans=max(lena,lenb);
for(int i=0;i<ans;i++){
if(a[i]<b[i]){
a[i+1]--; //退位
a[i]+=10;} //加10
c[i]=a[i]-b[i];} //c储存答案
while(c[ans-1]==0 && ans>1) ans--; //去除多余前导0
if(flag==1) cout<<"-";//看前面
for(int i=0;i<ans;i++){
cout<<c[ans-i-1];} //倒着输出
return 0;// over!
}
谢谢
ps. 我的思路和代码借鉴了很多大牛,在这里表达由衷的敬意