高精度减法 (C++)
题目描述:
输入两个大整数a,b,输出他们的差。(1<=a,b<=10^100)
输入格式:
两个大非负整数a,b。(1<=a,b<=10^100)
输出格式:
输出a减b的差。
输入样例:
35 45
输出样例:
-10
分析:
这道题依然是高精度,如果你会做高精度加法,那这题会变得很简单,不会也没关系,听作者慢慢分析。
首先,仍然是令人头疼输入问题,用字符串型输入就行了,然后是怎么做减法,举个例子:111-19
1 1 1
- 1 9
9 2
但输入进来的是:
1 1 1
1 9
那么我们在char转入int数组时倒着存就好了。
做减法解决了,输出上有个问题,那就是a-b可能是负数,既然是负数那就要有‘- ’号在前面,那么我们用一个bool类型的变量flag对差是否为负数进行判断,当flag==1时代表差是正数,当flag==0时就是负数。
那就开始写代码吧!
代码:
不准直接抄
#include <bits/stdc++.h>
using namespace std;
char ta[10100],tb[10100];
int la,lb,lc;
int a[10100],b[10100],c[10100];//a,b是转换时用的,c是存差的
int main(){
cin>>ta>>tb;
int la=strlen(ta);
int lb=strlen(tb);//求字符串长度
for(int i=0;i<la;i++)
a[i+1] =ta[la-1-i]-'0';
for (int i=0;i<lb;i++)
b[i+1] =tb[lb-1-i]-'0';
int lc=0,flag=1;
if(la>lb) flag=1;
else if(la<lb) flag=0;//如果长度上已近有差距了,赋值
else//长度一样的情况下
{
for(int i=0;i<la;i++)
{
if(ta[i]<tb[i])
{
flag=0;
break;
}
else
{
flag=1;
break;
}
}
}
if(la>lb) lc=la;
else lc=lb;//对差的长度进行赋值
if(flag==1)
{
for(int i=1;i<=lc;i++)
{
c[i]+=a[i]-b[i];
if(c[i]<0)//进行减法
{
c[i+1]--;
c[i] += 10;//借位操作
}
}
}else
{
cout<<"-";
for(int i=1;i<=lc;i++)
{
c[i] += b[i]-a[i];
if(c[i]<0)
{
c[i+1]--;
c[i]+=10;
}
}
}
while(c[lc]==0&&lc>1) lc--;
for(int i=lc;i>=1;i--)//倒着转换的就要倒着输出
cout<<c[i];
return 0;
}
验证方法:洛谷P2142 高精度减法,直接交,能AC
你学会了吗?
有问题可以在评论区讨论。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】