一本通1169 高精度减法

【题目描述】

求两个大的正整数相减的差。

【输入】

共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。

【输出】

一行,即所求的差。

【输入样例】

9999999999999999999999999999999999999
9999999999999

【输出样例】

9999999999999999999999990000000000000

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
	int a[256],b[256],c[256],lena,lenb,lenc,i;
	char a1[256],a2[256],n[256];
	gets(a1);
	gets(a2);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	lena=strlen(a1);
	lenb=strlen(a2);//前面步骤和加法一样,不再赘述
	if(lena<lenb||(lena==lenb&&strcmp(a1,a2)<0))
	{
	strcpy(n,a1);
	strcpy(a1,a2);
	strcpy(a2,n);
	cout<<"-";这几行代码的意思就是,如果被减数小于减数,那么两个数的值交换,并且输出一个负号
}
    for(i=0;i<lena;i++)
    {
    	a[lena-i]=a1[i]-48;
	}
	for(i=0;i<lenb;i++)
	{
		b[lenb-i]=a2[i]-48;
	}//字符变成数字
	i=1;
	while(i<=lena||i<=lenb)//因为结果肯定小于其中的任意一个数,所以位数也要小于等于
	{
		if(a[i]<b[i])
		{
			a[i]+=10;
			a[i+1]--;
		}//如果对应的一位被减数比减数小,那么前面一位减1,本位加10,也就是借1当10
		c[i]=a[i]-b[i];
		i++;
	}
	lenc=i;
	while((c[lenc]==0)&&(lenc>1))
	lenc--;//如果有后缀0,就删掉
	for(i=lenc;i>=1;i--)
	cout<<c[i];
	cout<<endl;
	return 0;
}

posted @ 2020-02-27 10:27  徐明拯  阅读(459)  评论(0编辑  收藏  举报