题目:
大整数的减法,求两个大的正整数相减的差
输入:共2行,第1行是被减数a,第2行是减数b(a>b).每个大整数不超过200位,不会有多余的前导零
输出:一行,即所求的差
【样例输入】
999999999999999999999999999999999999
9999999999
【样例输出】
999999999999999999999999990000000000
分析:
一、做大数的减法运算需要考虑问题
1)借位怎么处理?
2)借位后上一位怎么处理?
3)借位后本位怎么处理?
二、相关知识:字符‘9’,数字‘9’,如何相互转换
本质是字符ASCII运算
1)‘9’-‘0’ == 9 或者 ‘9’-48 == 9
2)9+‘0’ == ‘9’
参考代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
//求两个不超过200位的大数的差
char a[200],b[200],temp[200];
int a1[200],b1[200],c1[200],i;
int lena,lenb,lenc;
memset(a1,0,sizeof(a1)); //将存储被减数数的大数数组值全部置0
memset(b1,0,sizeof(b1)); //将存储减数的大数数组值全部置0
memset(c1,0,sizeof(b1)); //将结果数组置0
cout<<"请输入被减数和减数:"<<endl;
cin.getline(a,200);
cin.getline(b,200);
lena = strlen(a);
lenb = strlen(b);
//如果被减数比减数小,交换,并且将之后相减的结果 前面添加 负号
if(lena<lenb || (lena==lenb)&&strcmp(a,b)<0)
{
strcpy(temp,a);
strcpy(a,b);
strcpy(b,temp);
cout<<"-";
}
//重新计算被减数、减数的位数
lena=strlen(a);
lenb=strlen(b);
//将字符数组中的大数 逆序 存储到 整形数组中
for(i=0;i<lena;i++)
{
a1[lena-i] = a[i]-48; //存放被减数到a1数组 下标为0 不存放数据
}
for(i=0;i<lenb;i++)
{
b1[lenb-i] = b[i]- 48; //存放减数b1数组 下标为0 不存放数据
}
i=1;
while(i<=lena||i<=lenb)
{
if(a1[i]<b1[i]) //该借位了
{
a1[i]+=10;
a1[i+1]--;
}
c1[i]=a1[i]-b1[i];
i++;
}
lenc=i; //减后结果的位数
while((c1[lenc]==0)&&lenc>1)
{
lenc--;
}
//输出:
for(i=lenc;i>=1;i--)
{
cout<<c1[i];
}
cout<<endl;
return 0;
}
报名我的信息学竞赛课(C++基础课程、NOIP算法课程、市赛、区赛集训课程),可以加微信?????联系我,注明“姓名+优快云 课程咨询”~