高精度减法

本文介绍了如何使用字符串模拟进行高精度减法运算,避免了long long类型对于大整数的限制。通过将输入的非负整数转换为字符串,然后逐位进行减法操作,处理退位问题,并移除前导零。代码中还包含了检查大小并交换数值的逻辑,确保正确输出结果。
摘要由CSDN通过智能技术生成

废话少说

先看题目

高精度减法  
试题描述
任给两个长度不超过100位的非负整数,求两个数相减的精确结果。
输入格式
两行,分别是两个非负的大整数。
输出格式
输出一行,表示两数相减的结果,不能有多余的前导0。
输入样例1
1
99
输出样例1
-98

长度不超过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. 我的思路和代码借鉴了很多大牛,在这里表达由衷的敬意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值